【发布时间】:2012-08-14 13:16:40
【问题描述】:
我认为 Exception.fillInStackTrace 应该返回 Exception 或派生的 Exception 对象。考虑以下两个函数,
public static void f() throws Throwable {
try {
throw new Throwable();
} catch (Exception e) {
System.out.println("catch exception e");
e.printStackTrace();
}
}
public static void g() throws Throwable {
try {
try {
throw new Exception("exception");
} catch (Exception e) {
System.out.println("inner exception handler");
throw e.fillInStackTrace();
}
} catch (Exception e) {
System.out.println("outer exception handler");
e.printStackTrace();
}
}
-
exception handler无法在第一个函数f()中捕获new Throwable()。 -
exception handler可以在第二个函数g()中捕获e.fillInstackTrace()。 - 但是第二个函数
g()仍然需要throws Throwable。这真的很奇怪,因为我们可以捕捉到e.fillInstackTrace()。
所以我的问题是为什么 Exception.fillInStackTrace 不返回 Exception 或 Exception-derived 而不是开发这种奇怪的语法?
编辑:
澄清我的问题:我所说的“奇怪的语法”是什么意思
- 由于
Exception.fillInStackTrace()返回Throwable引用,接收Exception引用的异常处理程序应该无法捕获异常。因为java不允许隐式向下转换,它应该类似于return (Exception)e.fillInstackTrace()。李> - 由于设计为接收
Exception引用的异常处理程序可以处理Throwable异常,因此无需标记方法g()抛出Throwable异常。但是java编译器会强制我们这样做.
谢谢。
【问题讨论】:
标签: java exception-handling throwable