为什么我们不应该捕捉Java中的错误?

为什么我们不应该捕捉Java中的错误?,java,error-handling,Java,Error Handling,我知道,这会损害应用程序的性能,但我们不应该围绕代码的位置,这对例如 try { // code } catch (OutOfMemoryError ex) { // handling code } 看起来很安全 来自文档: 错误是Throwable的一个子类,表示存在严重问题 一个合理的应用程序不应该试图抓住 为什么不呢 错误类型实际上,我们无法猜测这会出现如下的特定代码块 try { // not guaranty OutOf memeroy Exc

我知道,这会损害应用程序的性能,但我们不应该围绕代码的位置,这对例如

try {
    // code        
} catch (OutOfMemoryError ex) {
    // handling code
}
看起来很安全

来自文档:

错误是Throwable的一个子类,表示存在严重问题 一个合理的应用程序不应该试图抓住


为什么不呢

错误类型实际上,我们无法猜测这会出现如下的
特定代码块

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

这就是我们不处理这些错误的原因。

您通常不应该尝试处理这些错误的原因是,通常情况下,您无法对它们采取任何措施


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

如果堆空间或perm gen空间已满,那么捕获OfMemoryError并在catch块中执行一些工作意味着什么?事实上,你无法猜测这种异常会在哪里发生。没有捕获此异常的逻辑。

您可以捕获任何可丢弃的内容,这意味着您可以捕获错误。但是错误代表了一个严重的问题,不建议捕捉

从Java API:

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


错误表示应用程序中存在一些关键问题。例如,当
Java虚拟机
无法分配对象时,会抛出OutOfMemoryError,因为该对象内存不足,垃圾收集器无法提供更多内存。因此,如果通过捕获
OutOfMemoryError
无法解决实际问题,除了
增加内存之外,并且通过在程序中捕获此错误可能不会导致任何解决方案,反而会导致易于出错的应用程序。因此,捕获错误是不可取的。

当JVM不再按预期工作或即将发生错误时,会出现错误。如果捕获到错误,则无法保证catch块会运行,更不用说它会一直运行到最后

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


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

您真的尝试过这样处理吗?我猜这些错误应该避免而不是处理。通过捕捉这些东西,您正在掩盖一个非常重要的潜在问题。可能这个问题已经被讨论过了:这是毫无意义的代码片段。@defaultlocale谢谢您的链接!我知道您说过
如果捕获到错误,就不能保证catch块会运行,更不用说它会一直运行到最后。
但是有证据证明这句话吗?给我指出某个地方的链接;当检测到该错误时,该错误以异步方式(§2.10)传递,并且可能发生在程序中的任何一点:如果jvm出现错误,它就会出现错误。如果停电,jvm就会死亡。在捕捉到错误之前,您可能无法生存。