可以处理堆栈溢出错误吗?


enter code here
static int i=10;
static void m1()
{
try {
if(i>=0)
{
System.out.println(i);
i--;
} 

m1();
}
catch (Throwable e) {
System.out.println("hii");
}
}
public static void main(String[] args) {

m1();
}

1)通过这种方式,我们可以处理堆栈溢出错误,但实际上Java不允许我们处理错误。2)第二点是,当我们在try块中得到异常时,然后只有受尊重的catch块将被执行,但在我们的场景中,当我们使用throwable e而不是exception e时,我们在try块中得到错误,但catch块正在执行。

如果有人知道这种情况背后的原因,请告诉我。

是否可以处理堆栈溢出错误?

是的。StackOverflowError不是特别的:它是一个Throwable,所以你可以捕获它。

你在这里遇到的问题是,你在堆栈的最顶端捕获和处理StackOverflowError(也就是说,当刚好要溢出时)。

你得到StackOverflowError时调用m1(),因为你不能调用m1()任何更多的时间;但是它与调用m1()本身无关,它与调用任何方法有关。

所以,当你试图处理它时,你调用一个方法(System.out.println),你得到另一个StackOverflowError,这是从catch抛出的,而不是try

你不应该试图处理StackOverflowErrors:相反,重构你的逻辑,使你永远不会接近溢出。

您得到的是StackOverflowError,因为递归中没有返回的基本条件。你只是无限期地调用m1()。因为您只对i>=0的值感兴趣,所以您可以这样修改m1:

static void m1() {
if(i<0)return;
try {
if(i>=0) {
System.out.println(i);
i--;
} 
m1();
}catch (Throwable e) {
System.out.println("hii");
}
}

最新更新