据我了解,以下代码应0
打印为输出,因为堆栈已满,应该立即退出方法。
但是,当我运行以下代码时,它为第一种情况打印100
,并为第二种情况打印1
:
class ErrorAndException {
public static int callStackOverflow() {
try {
callStackOverflow();
return 100;
} catch (Error e) {
System.out.println(e);
return 0;
} finally {
}
}
public static void main(String[] args) {
System.out.println(callStackOverflow());
}
}
案例 - 2
class ErrorAndException {
public static int callStackOverflow() {
try {
callStackOverflow();
return 100;
} catch (Error e) {
System.out.println(e);
return 0;
} finally {
return 1
}
}
public static void main(String[] args) {
System.out.println(callStackOverflow());
}
}
请帮助我理解这种行为。
只有对 callStackOverflow()
的最终调用(抛出 StackOverflowError
的调用(返回0
。但是当它返回时,之前对callStackOverflow()
的调用都返回 100。您的 main
方法仅打印初始调用 callStackOverflow()
返回的值,即 100
。
如果您希望将0
返回到 main
方法,callStackOverflow()
必须返回递归调用返回的值:
public static int callStackOverflow() {
try {
return callStackOverflow();
} catch (Error e) {
System.out.println(e);
return 0;
} finally {
}
}
导致溢出的最后一个项目将返回 0 到前一个实例,但该值将丢失,因为所有较低的实例只是相互返回 100,直到最后一个实例退出返回 100。