在再次调用之前终止函数?

Terminate function before calling again?

所以我一直在 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);
  }
}

这个可以,但是如果抛出异常的次数太多,就会抛出堆栈溢出错误。如何停止堆栈溢出错误?

使用循环而不是递归:

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

一旦你完成就跳出那个循环,否则它会循环再循环直到你的电脑死机、太阳爆炸或宇宙冻结

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

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

如果代码转到第二个捕获点,您将处于无限递归中。即使你做了一些事情来避免它,风险也非常高。我会建议只做第二次尝试,不要再尝试了。没有人想要无限循环的尝试和捕获。

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

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