3

我知道,它会损害应用程序的性能,但我们不应该围绕代码的地方,这确实有风险,例如

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

它看起来很安全。

来自文档:

Error 是 Throwable 的子类,表示合理的应用程序不应尝试捕获的严重问题。

为什么不?

4

5 回答 5

11

您通常不应该尝试处理这些错误的原因是因为通常您对它们无能为力。

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

于 2013-03-06T08:26:13.593 回答
2

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

来自 Java API:

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

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

于 2013-03-06T08:27:10.183 回答
1

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

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

这就是为什么我们不会处理。

于 2013-03-06T08:25:09.107 回答
1

当 JVM 不再按预期工作或即将发生错误时,将出现错误。如果你捕捉到一个错误,就不能保证catch块会运行,更不能保证它会运行到最后。

还要看运行的电脑,当前的内存状态,所以没办法去测试,尽力而为。你只会有一个危险的结果。

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

于 2013-03-06T08:30:40.007 回答
0

如果您的堆空间或永久生成空间已满,那么捕获 OutOfMemoryError 并在您的 catch 块中做一些工作是什么意思?实际上,您无法猜测此异常实际上会发生在哪里。没有逻辑可以捕获此异常。

于 2013-03-06T08:26:55.957 回答