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");
}
}