在再次调用之前终止函数?
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;
}
}
}
所以我一直在 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;
}
}
}