gpt4 book ai didi

java - Java 中是否可以进行错误恢复?

转载 作者:搜寻专家 更新时间:2023-11-01 02:43:04 25 4
gpt4 key购买 nike

考虑以下生成 StackOverflowError 的代码。

public class SimpleProgram {
static SimpleProgram s = new SimpleProgram();

public static void main(String[] args) {
s.f(0);
}

void f(int i) {
System.out.println("f :" + (++i));
g(i);
}

void g(int i) {
System.out.println("g :" + (++i));
f(i);
}
}

它只是打印从 1 到 n 的数字(当我执行时 f() 为 '5417')。之后它抛出 StackOverflowError 并终止。现在考虑第二个程序。

public class SimpleProgram{
static SimplePrograms = new SimpleProgram();

public static void main(String[] args) {
s.f(0);
}

void f(int i) {
try {
System.out.println("f :" + (++i));
g(i);
} catch (StackOverflowError e) {
System.out.println("f :" + (++i));
g(i);
}
}

void g(int i) {
try {
System.out.println("g :" + (++i));
f(i);
} catch (StackOverflowError e) {
System.out.println("g :" + (++i));
f(i);
}
}
}

现在它表现出一些奇怪的行为。该程序没有按预期终止,但重复显示的值(比如 f :4107 g :4108 到 f :4120 并再次返回 f :4107)。

我的问题是,为什么会这样?我认为像 StackOverflowError 这样的错误意味着当前线程的堆栈已满,因此无法恢复。该程序必须强制停止它的执行,即不调用下一个函数,但没有发生。JVM 线程堆栈能否按需增加其大小?

最佳答案

您的异常处理程序进行更多方法调用(对 System.out.println()f()g()) .这些调用可能会抛出一个新的 StackOverflowError,它可能会在调用堆栈的几层下方被捕获,因此您会看到数字无限下降并无限上升(因为随着异常下降,调用堆栈,调用堆栈中释放了一些空间,因此有空间可以进行其他调用。

这是我得到的部分输出(为了更清楚,我在 catch block 内的 println 语句中添加了“catch”):

第一个 StackOverflowError 发生在 System.out.println(String) 尝试调用 println() 时,这就是没有换行的原因显示在 g :9662catch g :9663 中。出于某种原因,在第一个 StackOverflowError 之后,还有大约 50 个额外调用的空间,直到我们得到另一个 StackOverflowError,之后错误会更周期性地出现。

... no eception till this point...
g :9660
f :9661
g :9662catch g :9663
f :9664
g :9665
f :9666
g :9667
f :9668
g :9669
f :9670
g :9671
f :9672
g :9673
f :9674
g :9675
f :9676
g :9677
f :9678
g :9679
f :9680
g :9681
f :9682
g :9683
f :9684
g :9685
f :9686
g :9687
f :9688
g :9689
f :9690
g :9691
f :9692
g :9693
f :9694
g :9695
f :9696
g :9697
f :9698
g :9699
f :9700
g :9701
f :9702
g :9703catch g :9704catch f :9703
g :9704catch g :9705catch g :9702
f :9703
g :9704catch g :9705catch f :9704
g :9705catch g :9706catch f :9701
g :9702
f :9703
g :9704catch g :9705catch f :9704
g :9705catch g :9706catch g :9703
f :9704
g :9705catch g :9706catch f :9705
g :9706catch g :9707catch g :9700
f :9701
g :9702
f :9703
g :9704catch g :9705catch f :9704
g :9705catch g :9706catch g :9703
f :9704
g :9705catch g :9706catch f :9705
g :9706catch g :9707catch f :9702
g :9703
f :9704
g :9705catch g :9706catch f :9705
g :9706catch g :9707catch g :9704
f :9705
....

关于java - Java 中是否可以进行错误恢复?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29430490/

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