gpt4 book ai didi

java - java如何处理StackOverflowError?

转载 作者:塔克拉玛干 更新时间:2023-11-02 19:08:15 26 4
gpt4 key购买 nike

这是我的示例应用

public class Main {

private long[] exceptionLevels = new long[1000];
private int index;

public static void main(String... args) {
Main main = new Main();
try {
main.foo(0);
} finally {
Arrays.stream(main.exceptionLevels)
.filter(x -> x != 0)
.forEach(System.out::println);
}
}

private void foo(int level) {
try {
foo(level + 1);
} catch (StackOverflowError e) {
exceptionLevels[index++] = level;
bar(level + 1);
}
}

private void bar(int level) {
try {
bar(level + 1);
} catch (StackOverflowError e) {
exceptionLevels[index++] = -level;
}
}
}

有时,当我运行应用程序时,我会看到这样的结果

8074
8073
-8074

这实际上意味着发生了以下情况

  • foo(8073) 调用 foo(8074)
  • foo(8074) 调用 foo(8075) 而死了
  • foo(8074) 记录自己并调用 bar(8075),它死了
  • foo(8074) 死亡,foo(8073) 捕获它,记录自己并调用 bar(8074)
  • bar(8074) 调用 bar(8075),它死了,所以 bar(8074) 记录自己
  • 从所有方法返回,正常关闭

我明白了,一切都很好。所以有一个可以理解的获取模式

X, X-1, -X

对于调用 X

的一些最大级别

但有时,调用 Main 会给出这种输出

6962
6961
-6963

实际上是

X, X-1, -(X+1)

所以问题是,怎么做?

附言此外,当我将所有内容更改为静态时,程序会完全改变它的行为,所以有时我会得到超过 3 个结果。

编辑:当我用 -Xss228k 运行它时,我总是得到

1281
1280
-1281

但使用 -Xss1m 再次运行时会出现随机堆栈大小,有时会出现上述情况。

最佳答案

运行您的代码可能会产生一些其他可能的输出。在我的 PC(Java 8、Windows)上,我通常会得到一对值,例如:

7053
-7055

但在极少数情况下我会:

9667
9666
-9667

不建议捕获任何 java.lang.Error,这是 JVM 可能无法恢复的异常情况。

关于java - java如何处理StackOverflowError?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50745719/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com