根据我的理解,下面的代码应该打印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。