1.概念:
目的:提高程序的容错性、健壮性
异常:程序的运行过程中出现的意外情况
异常处理:事先为程序运行中可能出现的异常所做的预案
【重点】异常处理并非避免异常而是应对异常情况
2.异常的分类
未检查异常 | 已检查异常 |
可以避免 | 不可避免 |
可处理可不处理 | 必须处理 |
发生原因来自于代码内部 | 发生原因来自于代码外部 |
3.异常的产生和传递
throw Throwable对象 抛出一个异常对象
//throw语句的作用等同于return语句
throw语句的作用等同于return语句
异常对象的传递,视同于方法的返回值传递,沿着方法的调用链向上传递
4.异常的处理
(1)声明抛出
//方法声明:
修饰符<泛型> 返回值类型 方法名(形参列表) 抛出的异常
//throws后可抛多个异常用逗号隔开
方法的覆盖:
①方法名、参数表必须相同;
②访问修饰符相同或更宽;
③返回值类型相同或是父类方法返回值子类;(Since 5.0)
④子类方法抛出的异常的范围不能比父类更宽,子类方法只能抛出比父类方法相同或更少异常。
(2)捕获异常(一次异常一次catch,try后可跟多个catch)
//捕获异常一般格式:
try{ 代码块}catch(异常的形参){ }catch(异常的形参){ }
①可以同时捕获子类异常和父类异常,但必须先捕获子类异常,再捕获父类异常;
②如果多个catch的代码相同,name多个catch可以合并在一个catch中(Since 7.0);
try{
System.out.println("m1");
mb(i);
System.out.println("m2");
}catch(IOException|MyException|RuntimeException e){
System.out.println("catch Exception");
e.printStackTrace();
}
③printStackTrace():打印异常的栈追踪信息,在自定义异常时,应该添加字符串参数的构造方法,以设置异常对象的message属性;
④finally子句:无论如何都会执行的代码(通常用于释放资源)
//(1)
try{}catch(){}
//(2)
try{}catch(){}finally{}
//(3)
try{}finally{}
//(3)中的try无法捕捉异常,只是为了保证finally里的代码一定要执行