捕获StackOverflowError有什么危害?

时间:2013-08-27 07:06:21

标签: java stack-overflow

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

2 个答案:

答案 0 :(得分:10)

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

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

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

来自the Javadoc of the Error superclass

  

错误是Throwable的子类,表示严重问题   一个合理的应用程序不应该试图抓住。最多的   错误是异常情况。 ThreadDeath错误,虽然是   “正常”条件,也是大多数错误的子类   应用程序不应该试图抓住它。

答案 1 :(得分:0)

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

错误发生后,应用程序的行为通常无法预测 - 错误表明情况异常

因此,如果抛出了StackOverflowError,则应用程序暂时达到堆栈位置的最大值。您可以重新检查您的应用程序以启动,例如垃圾收集器越早。