异常类型
Throwable 类是 Error 和 Exception 的父类,只有是 Throwable 的实例才能被 JVM 或者 Java 语句抛出,捕获。
Error:表示不希望被程序捕获或者是程序无法处理的错误,Error 类对象由 Java 虚拟机生成并抛出,大多数错误与代码编写者所执行的操作无关。
Checked Exception:受检查异常,需要被 try catch 捕获或者 throws 抛出;如果不处理,IDE 会提示编译不通过。
Runtime Exception(Unchecked Exception):运行时异常,由程序逻辑错误引起,程序应该尽可能的避免该类异常。
异常处理
异常发生时,有两种处理方式:捕获 or 抛出
捕获:try catch
抛出:
方法名上面声明抛出 throws。
方法内抛出 throw
异常抛出限制
- 父类的方法没有声明异常,子类在重写该方法的时候不能声明异常;
子类重写父类抛出的异常方法时,可以抛出或者不抛出异常;若抛出异常,子类抛出的异常类型必须与父类方法抛出异常类型相同,或者子类抛出的异常类型是父类方法抛出异常的子类。
1
2
3
4
5
6
7
8
9
10
11错误抛出情况:子类抛出的 IOException 和 RuntimeException 不是同类型,也不是其子类。
public class C {
public void fun() throws RuntimeException{
}
}
public class D extends C {
public void fun() throws IOException,RuntimeException{
}
}如果父类抛出了 CheckedException ,那么子类重写的方法可以抛出 RuntimeException
1
2
3
4
5
6
7
8
9
10正确的抛出情况:
public class A {
public void fun() throws IOException {
};
}
public class B extends A {
public void fun() throws IOException,RuntimeException{
}
}
自定义异常
所有异常都必须是 Throwable 的子类。
如果希望写一个检查性异常类,则需要继承 Exception 类。
如果你想写一个运行时异常类,那么需要继承 RuntimeException 类。
异常捕获流程
1、try{} 里有一个 return 语句,那么紧跟在这个 try 后的 finally{} 里的 code 会不会被执行,什么时候被执行,在 return 前还是后?
答案:会执行,在方法返回调用者前执行。