9

只是好奇。在关于捕获 StackOverflowErrors 的回答中,有人写道:“当然,在某些情况下,堆栈溢出可能会导致应用程序不一致,就像内存耗尽一样”。StackOverflowErrors 有什么特别之处,以至于它们可能会破坏应用程序状态,而不是在出现错误时抛出 NullPointerException?我能想到的一件事是 StackOverflowError 可能发生在通常永远不会抛出异常(或其他 Throwable,就此而言)的地方(例如简单的 getter),因此程序可能没有为此做好准备。有更多的恶魔问题吗?

4

2 回答 2

10

堆栈溢出错误根本不意味着内存已耗尽,并且本身不会造成任何不一致。

但是堆栈溢出错误通常是一个错误。您应该修复错误而不是捕获异常。不要使用异常系统来隐藏错误。

即使您知道存在堆栈过深的风险(例如图形探索),也有比让堆栈爆炸更好的方法来控制它。

错误超类的Javadoc

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

于 2013-08-27T07:09:13.013 回答
0

错误是一个不应该被捕获的严重问题:如果方法抛出错误,也不要捕获超类(Throwable),您不必声明 throws-clause

错误后应用程序的行为通常是不可预测的 - 错误表示异常情况

因此,如果抛出了 StackOverflowError,则应用程序目前已达到最大堆栈位置。您可以重新检查您的应用程序以尽快启动垃圾收集器。

于 2013-08-27T07:15:35.800 回答