Problem 66 Java异常基类Throwable?
Ans:
Throwable类是Java语言中所有错误和异常的基类。只有此类及其子类的实例才能被JVM或Java代码中作为异常抛出,同时catch语句也只接受Throwable类及其子类作为其参数类型。
Exception,RuntimeException以及Error均是Throwable类,其中Java代码中,只需要捕获Exception及其子类定义的异常类型,RuntimeException是一个特殊的异常类,一般由JVM抛出。Error类也不需要捕获,所以在方法异常捕获声明中,也不需要通过throws语句指明。
Throwable可以设置cause参数,即将两个Throwable类链接起来,可以在构造函数中传入Throwable类型的cause参数或通过initCause设置。第一个异常将被捕获,第二个异常将被抛出。
class MyException extends Exception {
} class MyException2 extends Exception {
} class MyException3 extends Exception {
}
class WhoCalled2 { public void f() throws MyException2, Throwable{ try { g(); } catch (MyException e) { throw new MyException2().initCause(new MyException3()); // throw new RuntimeException(new MyException2()); } }
public void g() throws MyException { throw new MyException(); } } |
调用函数f()时,捕获异常,将有如下输出:
com.fyj.test.MyException2
at com.fyj.test.WhoCalled2.f(ExceptionTest.java:62)
at com.fyj.test.ExceptionTest.doTest(ExceptionTest.java:24)
at com.fyj.test.Main.main(Main.java:17)
Caused by: com.fyj.test.MyException3
... 3 more
最后,addSuppressed这个方法,可以让一个Exception被当前的Exception阻拦,即不会被Catch捕获。