2012-04-19 45 views
1

需要你在下面的代码反馈 -捕获的Throwable错误

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对象。所以我得到了输出“内部可抛”&“内心终于”。但是因为我们抛出OutofMemError不应该退出代码(即最终不会抛出Throwable &)?在实际的实际项目中,如果我们得到OutOfMemoryError,应用程序就会退出......为什么这种差异?

+0

这就是为什么你不抓住'Throwable' – 2012-04-19 17:57:47

回答

3

一般情况下,错误可以被抓到过(除非他们崩溃的VM或东西),和Java 6日起允许捕获的OutOfMemoryError。

8

enter image description here

OutOfMemoryError是一个亚类Error类,这是一个子类Throwable类的。这就是为什么它打印出:

内赶上抛出

2

它不管什么异常或错误或子类Throwable的(这并不一定是个例外或错误)你可以捕获Throwable。

什么都不能导致线程退出异常System.exit(0);而是尝试。

4

不,代码不会退出,因为您正在吞咽异常。你描述的'传统的Java程序'在这种错误上崩溃,因为这个异常没有被处理。您可以通过在程序的主线程上安装默认的异常处理程序来自己测试。

Thread.setDefaultUncaughtExceptionHandler(new UncaughtExceptionHandler() { 

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

throw new OutOfMemoryError();