第27 章 : 异常的捕获及处理
116 认识异常对程序的影响
出现错误后,程序中断执行
为了保证程序出现非致命错误之后,程序依然可以正常完成
异常处理机制保证程序的顺利执行
117 处理异常
语法
try{
} catch(异常类型 异常对象){
// 处理异常
} catch(异常类型 异常对象){
// 处理异常
}
...
finally{
// 不管是否出现异常都会执行
}
异常
System.out.println(2/0);
// java.lang.ArithmeticException: / by zero
异常捕获
try{
System.out.println(2/0);
}
catch(ArithmeticException e){
System.out.println(e);
// java.lang.ArithmeticException: / by zero
}
打印完成的异常信息
printStackTrace()
try{
System.out.println(2/0);
}
catch(ArithmeticException e){
e.printStackTrace();
// java.lang.ArithmeticException: / by zero
// at Demo.main(Demo.java:4)
}
118 处理多个异常
如果明确知道会发生什么异常,可以使用if做判断
119 异常处理流程
Error 程序还未执行性出现的错误,开发者无法处理
Exception 程序中出现的异常,开发者可以处理
异常体系
Object
-Throwable
-Exception
所有异常都可以用 Exception 处理
捕获范围大的异常要放在最后
120 throws关键字
告诉调用者可能会出现的异常
如果主方法继续抛出异常,表示此异常交由JVM处理
class Demo{
public static int div(int x, int y) throws ArithmeticException{
return x / y;
}
public static void main(String[] args) {
try{
int x = div(1, 0) ;
}catch(ArithmeticException e){
e.printStackTrace();
}
}
}
121 throw关键字
手动抛出异常
try{
throw new Exception("主动抛出异常");
}catch(Exception e){
e.printStackTrace();
// java.lang.Exception: 主动抛出异常
}
区别:throw & throws
throw 在代码块中使用,主动抛出异常对象
throws 在方法定义上使用,明确告诉调用者可能产生的异常
122 异常处理模型
try{
result = x / y;
} catch(Exception e){
throw e;
}finally{
System.out.println("结束...");
}
简化写法
try{
result = x / y;
} finally{
System.out.println("结束...");
}
123 RuntimeException
函数定义标注了可能抛出的异常,不过并没有要求强制处理
区别 RuntimeException & Exception
RuntimeException 是 Exception子类
RuntimeException 子类不要求强制处理异常
Exception 必须处理
124 自定义异常类
继承 RuntimeException(可选处理),Exception(必须处理)
// 如果继承自Exception
// 错误: 未报告的异常错误MyException; 必须对其进行捕获或声明以便抛出
class MyException extends RuntimeException{
public MyException(String message){
super(message);
}
}
class Demo{
public static void main(String[] args) {
throw new MyException("自定义异常");
// Exception in thread "main" MyException: 自定义异常
}
}
125 assert断言
JDK >= 1.4
确定代码执行到某行之后,一定是所期待的结果
不一定是准确的,也可能出现偏差,但是这种偏差不应该影响程序的正常执行
Java中的断言需要指定运行参数才生效
int x = 9 ;
assert x == 10;
编译运行没有任何结果
启用断言
java -ea Demo
程序抛出异常
Exception in thread "main" java.lang.AssertionError