需要您对以下代码的反馈 -
public static void main(String[] args) {
try {
throw new OutOfMemoryError();
} catch (Exception e) {
System.out.println("Inside catch");
} catch (Throwable t){
System.out.println("Inside catch throwable");
}finally {
System.out.println("Inside finally");
}
}
这里我从try子句&中抛出一个OutOfMemoryError对象(使用new运算符)捕捉Throwable对象。所以我得到输出“Inside catch throwable”& “终于内心”。但是因为我们抛出OutofMemError不应该代码退出(即没有进入Throwable& finally)?在实际的实际项目中,如果我们得到OutOfMemoryError,那么应用程序就会退出...为什么会出现这种差异?
答案 0 :(得分:8)
OutOfMemoryError
是Error
类的子类,它是Throwable
类的子类。这就是打印出来的原因:
内部抓住可抛出
答案 1 :(得分:4)
不,代码不会退出,因为您正在吞下异常。您描述的“传统Java程序”因此类错误而崩溃,因为未处理异常。您可以通过在程序的主线程上安装默认异常处理程序来自行测试。
Thread.setDefaultUncaughtExceptionHandler(new UncaughtExceptionHandler() {
@Override
public void uncaughtException(Thread t, Throwable e) {
e.printStackTrace(System.err);
}
});
throw new OutOfMemoryError();
答案 2 :(得分:3)
通常,也可以捕获错误(除非它们崩溃VM或其他东西),Java 6以后允许捕获OutOfMemoryError。
答案 3 :(得分:2)
什么异常或错误或Throwable的子类(不必是异常或错误)都可以捕获Throwable。
没有什么可以导致线程退出异常System.exit(0);
尝试相反。