1

需要您对以下代码的反馈 -

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”和“Inside finally”。但是既然我们抛出 OutofMemError 不应该代码退出(即不去 Throwable & finally)?在实际的实际项目中,如果我们得到 OutOfMemoryError,应用程序就会退出......为什么会有这种差异?

4

4 回答 4

8

在此处输入图像描述

OutOfMemoryError是类的子Error类,是类的子Throwable类。这就是它打印出来的原因:

内接可投掷

于 2012-04-19T17:52:16.363 回答
4

不,代码不会退出,因为您正在吞噬异常。您描述的“传统 Java 程序”在出现此类错误时崩溃,因为未处理异常。您可以通过在程序的主线程上安装默认异常处理程序来自行测试。

Thread.setDefaultUncaughtExceptionHandler(new UncaughtExceptionHandler() {

   @Override
   public void uncaughtException(Thread t, Throwable e) {
      e.printStackTrace(System.err);
   }
});

throw new OutOfMemoryError();
于 2012-04-19T17:55:13.847 回答
3

通常,也可以捕获错误(除非它们使 VM 崩溃或其他原因),并且 Java 6 及更高版本允许捕获 OutOfMemoryError。

于 2012-04-19T17:55:59.233 回答
2

可以捕获 Throwable 的异常或错误或 Throwable 的子类(不一定是异常或错误)并不重要。

没有什么可以导致线程退出异常System.exit(0);尝试改为。

于 2012-04-19T17:53:57.440 回答