JAVA进阶知识2——异常
昨天我们学习了JAVA进阶知识1——面向对象,今天我们继续复习!
1.异常概述
异常:异常就是程序运行过程中出现了不正常现象导致程序中断,在Java中, 把各种异常现象进行了抽象形成了异常类
2.异常处理
运行时异常不需要预处理,通过规范的代码可以避免;
受检异常必须预处理, 否则编译报错, 有两种预处理方式 :
1) 捕获处理
2) 抛出处理
异常预处理的好处:对异常进行处理后, 在程序运行过程中,即使出现了异常,程序也不会中断,继续向下执行,异常预处理可以提高程序的健壮性(鲁棒性,Robust)
2.1 异常捕获处理
try{
对可能产生异常的代码进行检视
如果try代码块的某条语句产生了异常, 就立即跳转到catch子句执行,try代码块后面的代码不再执行
try代码块可能会有多个受检异常需要预处理, 可以通过多个catch子句分别捕获
}catch( 异常类型1 e1){
捕获异常类型1的异常,进行处理
在开发阶段, 一般的处理方式要么获得异常信息,要么打印异常栈跟踪信息
e1.printStackTrace();
在部署后, 如果有异常,一般把异常信息打印到日志文件中
} catch( 异常类型2 e1){
捕获异常类型2的异常,进行处理
如果捕获的异常类型有继承关系, 应该先捕获子异常再捕获父异常; 如果没有继承关系, catch子句没有先后顺序
}finally{
不管是否产生了异常,finally子句总是会执行
一般情况下,会在finally子句中释放系统资源
}
如:
try{
同学抽烟
扔烟头,引起纸团着火
打火机爆炸引起被包着火
宿舍着火
}catch(抽烟引起纸团着火 e ){
用脚踩
}catch( 被包着火 e2){
使用灭火器
}catch( 宿舍着火 ){
119
}
2.2 throws抛出处理
在定义方法时, 如果方法体中有受检异常需要预处理, 可以捕获处理,也可以抛出处理.
谁调用这个方法,谁负责处理该异常,
在定义方法时,把异常抛出就是为了提醒方法的使用者,有异常需要预处理
main方法交由JVM处理,JVM的处理方式就中断程序, 打印异常信息;
在处理异常时, 是选择捕获处理还是抛出处理??
1)一般情况下, 在调用其他方法时, 如果被调用的方法有受检异常需要预处理, 选择捕获处理
2)在定义方法时, 如果方法体中有受检异常需要预处理,可以选择捕获 ,也可以选择抛出处理; 如果方法体中通过throw语句抛出了一个异常对象,所在的方法应该使用throws声明该异常
3 方法覆盖中的异常处理
方法覆盖(重写)规则:
- 方法签名必须相同, 方法名与参数列表就是方法签名
- 方法的返回值类型可以相同 , 子类方法的返回值类型可以是父类方法返回值类型的子类型
- 子类方法的访问权限可以更宽泛(更大),
a) 如果父类方法使用public修饰,子类方法只能是public修饰
b) 如果父类方法使用protected修饰,子类方法可以是protected/public修饰 - 子类方法的异常要比父类方法的异常更小,
a) 如果父类方法没有抛出异常,子类重写后也不能抛出异常
b) 如果父类方法抛出了异常,子类方法可以抛出相同的异常,也可以抛出父类异常的子异常,也可以不抛出异常
4 异常在开发中应用
自定义异常
1)定义一个类继承Exception
2)在自定义异常类中提供无参、有参两种构造方法
3)在需要的位置(一般在实体类的set方法中)通过throw抛出异常对象
4)throw所在的方法通过throws声明该异常
5)调用方法时,需要对受检异常预处理