何时捕获java.lang.Error?

问题

在什么情况下应该抓一个申请java.lang.Error


#1 热门回答(89 赞)

通常,永远不会。但是,有时你需要捕获特定的错误。

如果你正在编写框架代码(加载第三方类),那么捕获LinkageErrors(没有发现类def,不满意的链接,不兼容的类更改)可能是明智的。我也看到一些愚蠢的第三方代码抛出错误的子句,所以你也必须处理它们。

顺便说一句,我不确定是否无法从OutOfMemory中恢复。


#2 热门回答(46 赞)

决不。你永远无法确定应用程序是否能够执行下一行代码。如果你得到aOutOfMemoryError,你有no guarantee that you will be able to do anything reliably。 Catch RuntimeException并检查了Exceptions,但从不出错。
http://pmd.sourceforge.net/rules/strictexception.html


#3 热门回答(15 赞)

通常,你应始终catchjava.lang.Error并将其写入日志或将其显示给用户。我支持并且每天都看到程序员无法分辨程序中发生了什么。

如果你有一个守护程序线程,那么你必须防止它被终止。在其他情况下,你的应用程序将正常工作

你应该只抓到java.lang.Error最高级别。

如果查看错误列表,你将看到大多数错误都可以处理。例如aZipError在读取损坏的zip文件时发生。

最常见的错误是OutOfMemoryErrorNoClassDefFoundError,它们在大多数情况下都是运行时问题。

例如:

int length = Integer.parseInt(xyz);
byte[] buffer = new byte[length];

可以产生一个OutOfMemoryError但它是一个运行时问题,没有理由终止你的程序。

NoClassDefFoundError主要是因为库不存在或者你使用其他Java版本。如果它是你程序的可选部分,那么你不应该终止你的程序。

我可以提供更多的例子,说明为什么在最高级别捕获Throwable并产生有用的错误消息是个好主意。