为什么我们不能捕获Java中的错误?

时间:2013-03-06 08:19:55

标签: java error-handling

我知道,它会损害应用程序的性能,但是我们不应该围绕代码区域,因为这样的代码确实存在风险。

try {
    // code        
} catch (OutOfMemoryError ex) {
    // handling code
}

看起来很安全。

来自docs:

  

错误是Throwable的子类,表示严重问题   合理的申请不应该试图抓住。

为什么不呢?

5 个答案:

答案 0 :(得分:10)

您通常不应该尝试处理这些错误的原因是因为通常情况下您不会对它们做任何事情。

它们往往是JVM级错误,而不是应用程序级错误--OutOfMemory就是一个很好的例子。如果JVM内存不足,你的程序会做什么?即使你确实抓到它,也没有保证处理代码会以一致的方式完成/继续,因为抛出了终端条件

答案 1 :(得分:2)

你可以捕获任何Throwable,这意味着你可以捕获错误。但错误代表一个严重的问题,不建议捕获。

  

来自Java API:

     

“错误是Throwable的子类,表示合理的>应用程序不应该尝试捕获的严重问题。大多数此类错误都是异常情况。> ThreadDeath错误,虽然是”正常“条件,但也是Error的子类,因为大多数>应用程序不应该尝试捕获它。“

错误表示您的应用程序存在一些严重问题。例如,当Java Virtual Machine无法分配一个对象时,将抛出 OutOfMemoryError ,因为它没有内存,并且垃圾收集器不再提供更多内存。因此,如果通过捕获OutOfMemoryError 将无法解决除increasing the memory之外的实际问题,并且通过在程序中捕获此错误可能不会导致任何解决方案,而是导致容易出错的应用程序。因此,不建议捕获错误。

答案 2 :(得分:1)

Error类型实际上我们无法猜测这将是perticular block of Code,如下所示。

try {
    // not guaranty OutOf memeroy Exception will come from this block      
} catch (OutOfMemoryError ex) {
    // handling code
}

这就是我们无法处理的原因。

答案 3 :(得分:1)

当JVM不再按预期工作或接近时,会出现错误。如果你发现错误,就不能保证catch块会运行,甚至不会保证它会一直运行到最后。

它还将取决于正在运行的计算机,当前的内存状态,因此无法测试,尝试并尽力而为。你只会有一个不幸的结果。

您还会降低代码的可读性。

答案 4 :(得分:0)

如果堆空间或perm gen空间已满,捕获OutOfMemoryError并在catch块中执行某些操作有什么意义?实际上你无法猜测这个例外实际发生在哪里。没有逻辑可以捕获这个异常。