再次呼叫之前终止功能?

时间:2018-06-14 13:52:16

标签: java recursion exception-handling stack stack-overflow

所以我一直在研究Java程序。我有一个运行一些代码的函数,当代码抛出异常时我想再次调用它。像这样:

public void x (String str) {
  try {
    // Initialize
  } catch (SomeException e) {
    System.out.println("Initializing again...");
  }
  try {
    // Do stuffz
  } catch (SomeOtherException e) {
    System.out.println("Trying again...");
    x(str);
  }
}

这样可行,但如果它抛出异常太多次,它将抛出堆栈溢出错误。如何停止堆栈溢出错误?

4 个答案:

答案 0 :(得分:1)

使用循环而不是递归:

public void x(String str){
    for(;;){ // equal to while(true)
        try {
            // Initialize
        } catch (SomeException e) {
            System.out.println("Initializing again...");
            continue; // returning the loop
        }
        try {
            // Do stuffz
            break; // break out of loop if finished
        } catch (SomeOtherException e) {
            System.out.println("Trying again...");
        }
    }
}

一旦完成就会突破该循环,否则它将循环并循环并循环直到您的计算机死亡,太阳爆炸或宇宙冻结

答案 1 :(得分:0)

发生堆栈溢出是因为您实际上没有更改可能影响函数的参数中的任何内容以返回其他结果。这意味着每当你为引起异常的参数启动这样的函数时,它将在内部调用中引起相同的异常。 当您使用递归时,您应该始终注意退出条件。 如果没有其他正当理由,在这种情况下递归不是一个好的解决方案。 你应该使用一个循环或添加一些条件来退出递归,它可以是你的情况下的尝试次数。

public void x (String str, int attempts) {
if (attempts > 100)
   return;
try {
    // Initialize
} catch (SomeException e) {
    System.out.println("Initializing again...");
    try {
        // Do stuffz
    } catch (SomeOtherException e) {
        System.out.println("Trying again...");
        x(str,attempts+1);
    }
}
}

答案 2 :(得分:0)

如果代码转到第二个catch,则处于无限递归状态。即使你做了避免它的事情,风险也很高。我建议只做第二次尝试而不再做。没有人想要一个尝试和捕获的infinte循环。

答案 3 :(得分:0)

也许您可以使用包装函数,即:

public void wrapper (String str) {
  while (true) {
    try {
      x(str);
    } catch (SomeException e1) {
      System.out.println("Initializing again...");
      continue;
    } catch (SomeOtherException e2) {
      System.out.println("Trying again...");
      continue;
    }
  }
}