异常
什么是异常?
- 阻止程序编译,运行时的错误称作为异常。
- 运行时异常
- 编译时异常
- 逻辑异常
关系图:
常见异常表
检查型异常和非检查型异常
-
检查型异常
-
# 在Java中所有不是RuntimeException派生的Exception都是检查型异常。 # 必须进行捕获处理。否则会在编译时报错。
-
非检查型异常
-
# 在Java中所有RuntimeException的派生类都是非检查型异常 # 可以不进行捕获处理,但如果产生了异常,那么将会被JVM进行处理 # 推荐都要捕获处理
常见异常
自己创建异常
自创异常:
- 继承Exception,添加一个有有参构造器,和一个无参构造器
public class CreateException extends Exception{
public CreateException() {
}
public CreateException(String msg){
super(msg);
}
}
测试:
- 需要当场捕获就用try{}catch(){}
- 不需要就往外抛出就行了
public class TestException {
public static void main(String[] args) {
try {
throw new CreateException("自创异常!");
} catch (CreateException e) {
e.printStackTrace();
}
}
}
最好的实践
- 在catch代码块中写明白是哪里出了错误,方便定位异常位置,和便于及时处理
- 在连接数据库的时候,对文件IO的操作时,通常会在finally代码块中进行流的关闭处理
throw和throws关键字的不同点
throw
# 是用来怕抛出任意异常的
thorws
# 总是出现在函数头部,用来标明该函数可能抛出的所有异常。
异常链
# 一种处理异常的概念
# 一种异常中抛出另一个异常,从而异常与异常之间形成了链
# 当抛出新异常时。一定要包含原有的异常。
# 这样才能通过getCause()和initCause()来获取最终源头
finall是否会执行
# 如果是try里面有return 那么 finally一定会执行
# 如果是System.exit(0) 退出JVM的话。finally将不会执行
Java 中 final,finalize,finally 关键字的区别
# final 是修饰类,不能被继承。修饰属性,则变成常量。修饰方法。则不能被重写
# finally 是try catch finally 搭配使用的,用来处理异常后,执行的代码块。通常用于关闭一些流和连接的处理。
# finalize 是Object类中的一个方法。当执行GC()垃圾回收时,会调用它,它会去判断对象是否可以回收
继承抛出异常
# 在继承了父类方法后,父类方法上有异常
# 子类重写的时候一定要抛出比父类小的异常