好奇。 In an answer关于捕获有人写道的StackOverflowErrors:“当然有些情况下堆栈溢出可能会使应用程序不一致,就像内存耗尽一样”。 StackOverflowErrors有什么特别之处,它们可能会破坏应用程序状态,比如在出现Bug时抛出NullPointerException?我能想到的一件事是StackOverflowError可能发生在通常永远不会抛出异常(或其他Throwable)的地方(例如一个简单的getter),所以程序可能没有为此做好准备。还有更多恶魔般的问题吗?
答案 0 :(得分:10)
堆栈溢出错误并不意味着内存耗尽,并且本身不会产生任何不一致。
但堆栈溢出错误通常是一个错误。你应该修复bug而不是捕获异常。不要使用异常系统来隐藏错误。
即使您知道存在堆叠太深的风险(例如图形探索),也有更好的方法来控制它,而不是让堆栈爆炸。
来自the Javadoc of the Error superclass:
错误是Throwable的子类,表示严重问题 一个合理的应用程序不应该试图抓住。最多的 错误是异常情况。 ThreadDeath错误,虽然是 “正常”条件,也是大多数错误的子类 应用程序不应该试图抓住它。
答案 1 :(得分:0)
错误是一个不应该被捕获的严重问题 因此:也不要抓超级(Throwable) 如果方法抛出错误,则不必声明throws-clause
错误发生后,应用程序的行为通常无法预测 - 错误表明情况异常
因此,如果抛出了StackOverflowError,则应用程序暂时达到堆栈位置的最大值。您可以重新检查您的应用程序以启动,例如垃圾收集器越早。