1.异常
1.1 异常
-
java.lang 包中的类或接口直接使用
-
概念:指程序在执行的过程中出现了非正常的情况,最终JVM终止工作
-
异常的体系:
java.lang.Object java.lang.Throwable Throwable是Error和Exception的基类(父类) java.lang.Error:表示出现严重错误 .jvm的错误,通过程序无法解决 java,lang,Exception:表示异常类,异常产生后可以通过代码解决 编译时异常:程序在编译时出现的异常 javac.exe 运行时异常:程序在运行时出现的异常 java.exe
1.2 解决异常
- 异常中所用到的关键字: try catch finally throw throws
-
throw 抛出异常
- 作用:可以在方法内用throw 手动抛出异常
- 格式:throw new xxxException(“异常的消息”)
- 注意:
- throw 写在方法内
- throw后面的异常类型 一定是Exception 类型或它的子类型
- throw 抛出的异常必须要处理
- 如果throw后面写的异常类型是编译时异常必须要处理(1. throws 2.try…catch)
- 如果throw后面写的运行时异常 可不处理该异常
- throwable:有两个方法来获取异常消息
- getMassage() 获取详细消息字符串
- printStackTrace() 打印堆栈跟踪的信息(异常消息多)
-
throws 解决异常的第一种方式
throws: 声明式异常(自己不处理异常,有其他调用该方法的用户处理)
-
格式:返回值类型 方法名称(参数)throws XxxException{ }
-
注意:throws后面写的异常类型必须是Exception或者是它的子类型,可以写多个异常的类型,也可以只用一个父的异常类型
throws声明什么样的异常,调用者也要解决或者声明什么异常
public class TestThrows { public static void main(String[] args) throws Exception { // 没有解决但是声明异常了 就交给jvm处理 readFile("c:/a.txt"); } public static void readFile(String fileName) throws FileNotFoundException,Exception { //1声明异常之后将异常抛给调用者 if(fileName.equals("c:/a.txt")) { throw new FileNotFoundException("文件未找到"); } if(fileName.endsWith("txt")) { throw new Exception("文件类型不匹配"); } } }
-
-
try…catch 解决异常的第二种方式
try…catch:捕获异常
-
格式:写在方法中
try{ 可能会出现的异常代码 }catch( 捕获的异常类型 对象){ 捕获异常 }
可以有多个catch块
-
注意:
try块中如果有异常,try块后面的代码不执行,此时会跳转到catch块
多个代码块异常,catch块先写子类再写父类,也可以只用父类异常
public class TestTryCatch { public static void main(String[] args) { // 没有解决但是声明异常了 就交给jvm处理 try { readFile("c:/a.txt"); System.out.println("try块后面的代码"); } catch (FileNotFoundException e) { System.out.println(e.getMessage()); } catch (Exception e) { System.out.println(e.getMessage()); } } public static void readFile(String fileName) throws FileNotFoundException,Exception { //1声明异常之后将异常抛给调用者 if(fileName.equals("c:/a.txt")) { throw new FileNotFoundException("文件未找到"); } if(fileName.endsWith("txt")) { throw new Exception("文件类型不匹配"); } } }
-
-
finally
不论有没有异常,finally块中的代码始终会执行(除非jvm结束)
- 格式:try{ 可以会发生的代码 }catch(异常类型 e){ 捕获异常}finally{无论有无异常,都会执行}
- 注意
- finally块不能单独使用 一般和try块使用
- finally块一般用于释放资源
public class TestFinally { public static void main(String[] args) { show(); } public static void show() { try { System.out.println("try"); System.exit(0); //jvm正常结束 0 非正常结束 1或者-1 }catch(Exception e){ System.out.println("catch"); }finally { System.out.println("finally"); } } }
-
1.3 自定义异常
-
自定义异常类型,必须继承Exception或RuntimeException
-
定义注册异常类,实现用户不能重复注册
public class TestRegister { //现有的用户信息 static String[] names=new String[] {"jack","李涛","GEM"}; public static void main(String[] args) { try { reg("jack"); } catch (RegisterException e) { System.out.println(e.getMessage()); } System.out.println("结束"); } public static void reg(String name) throws RegisterException { for(String n : names) { if(name.equals(n)) { throw new RegisterException(n+"已被注册"); } } } }