Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/324.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 捕获堆栈溢出错误的危害是什么?_Java_Stack Overflow - Fatal编程技术网

Java 捕获堆栈溢出错误的危害是什么?

Java 捕获堆栈溢出错误的危害是什么?,java,stack-overflow,Java,Stack Overflow,只是好奇。关于捕获StackOverflowers错误,有人写道:“当然,在某些情况下,堆栈溢出可能会导致应用程序不一致,就像内存耗尽一样。”。StackOverflowers错误有什么特别之处,它们可能会破坏应用程序状态,而不是在出现错误时抛出NullPointerException?我能想到的一件事是,StackOverflowerError可能发生在通常从未抛出异常(或其他可抛出的异常)的地方(例如,一个简单的getter),因此程序可能没有为此做好准备。还有更可怕的问题吗?堆栈溢出错误根

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

堆栈溢出错误根本不意味着内存耗尽,也不会使任何内容本身不一致

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

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

发件人:

错误是Throwable的一个子类,表示存在严重问题 一个合理的应用程序不应该试图抓住。大多数这样的 错误是异常情况。ThreadDeath错误,尽管是 “正常”条件也是错误的一个子类,因为大多数 应用程序不应该试图捕获它


错误是一个不应该被发现的严重问题 因此:也不要抓住超级类(可丢弃) 如果方法抛出错误,则不必声明throws子句

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


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

我认为SOE通常会由于编码错误而不是数据错误而发生。其他评论说“堆栈溢出错误通常是一个bug”,但通常不是一个NPE吗?@user2310289有很多方法可以落在NPE上,所以很多时候你可能希望跳过一些测试,有时依赖try/catch系统。但是是的,捕捉NPE也应该是罕见的。请注意,这是一个错误!也不例外@PhilippSander我澄清了这一点——我的意思不是java.lang.exception意义上的“异常”,而是一个通用术语。不过,我看不出java.lang.Error和java.lang.Exception之间有什么根本性的区别——除了一个强烈的提示,即错误更严重,并且通常无法正常地从中恢复过来。有趣的是……实际上,您无法捕捉到这个错误。虚拟机在你做任何事情之前就崩溃了。@PaulNikonowicz-事实上,你可以抓住它。。。如果JVM得到了正确的实现。你只需要足够深入地捕捉它,以便有足够的堆栈空间来执行处理程序需要执行的操作。即使它确实是一个OutOfMemoryError(OutOfMemoryError)——为什么这会导致任何不一致——比导致异常的任何其他bug都要多?顺便说一句:在一个像样的应用程序中,你需要在应用程序的顶层捕捉所有东西,包括错误,以避免向最终用户显示stacktrace,并可能进行一些错误记录和错误报告。当你有OutOfMemory错误时,你可以尝试记录,但任何像样的应用程序都必须在该点停止。感谢回答。我不太明白垃圾收集器与此有什么关系。无论如何,我的问题是,国有企业是否会产生比我在问题中指出的更严重的后果。