Java “我怎么能?”;“重试”;试一试?

Java “我怎么能?”;“重试”;试一试?,java,exception-handling,Java,Exception Handling,在我的代码中,我将在try块中尝试某个任务。如果抛出异常,catch块将纠正遇到的错误(通常提示输入正确)。在那之后,程序应该反复尝试,直到成功为止。我目前的代码如下: for (bool isSuccess = false; !isSuccess;) { try { ... isSuccess = true; } // catch blocks here to correct any exceptions thrown } 可以看出,我

在我的代码中,我将在try块中尝试某个任务。如果抛出异常,catch块将纠正遇到的错误(通常提示输入正确)。在那之后,程序应该反复尝试,直到成功为止。我目前的代码如下:

for (bool isSuccess = false; !isSuccess;) {
    try {
        ...
        isSuccess = true;
    }
    // catch blocks here to correct any exceptions thrown
}

可以看出,我目前正在使用循环结构,在try块失败时重新启动try-catch块,直到try块完全成功。有更优雅的解决方案吗?

我更喜欢看到默认退出的
do
循环(这样就不太可能遇到无限循环)。使用
boolean
类型实际上只是模仿了
break
continue
的行为。另一种可能更自然的方法是考虑

do {
    try {
        // some code 
    } catch (/*whatever*/){
        continue; // go again
    }
    break;
} while (true);

您可以简单地使用while循环

while(!isSuccess){
    try{
        //DO Stuff
    }
}

我认为你应该定义最大的尝试次数。否则,在最坏的情况下,当所有故障发生时,您的应用程序将被冻结。

您可以使用
while
循环执行此操作

boolean isSuccess = false;
while(!isSuccess) { // loop till to isSuccess become true
    try {
        ....
        isSuccess = true;
    } catch (Exception e) {
        // Some Exception accrued, you can have 2 options
        // 1. break the loop with break;
        // 2. continue the process
    }
}

只是给你一个选择,如果你的代码允许你这么做,那么你也可以使用递归。但在我看来,与其他解决方法相比,这是不太有利的

public void doSomething() {
    try {
       ...
    } catch(Exception e) {
       doSomething();
    }
}

您也可以使用递归来实现这一点。但我不认为这是有效的。做while是最好的方法。

while循环可以做到这一点。我看不出你的方法有什么问题。为什么要更改它?我个人会使用
break
语句来终止循环,但无论如何,如果你想重复相同的操作(例如,提示输入),你需要一个循环(当然是递归,但我个人不会)。只要检查是否有更好的方法,我确信我试图用我的try块做的是一件普通的事情,而不是在一般情况下。当异常发生时,99/100次它是不可恢复的,您只想让异常冒泡到它被记录并且应用程序或线程被中断的点。您的案例,大概是从键盘读取输入,是您需要它的例外案例之一。我可以向您保证,在实际应用程序中,您不会经常编写代码来读取键盘输入。
false
标志表示continue将不起作用。在它到达那里之后,检查条件并退出控制。你是对的,但我告诉你的是,当发生异常时,控制宁愿退出,而不是重新尝试,或者在循环开始时继续;do{if(i@xploreraj;你是对的(你知道!)。终于有时间来解决这个问题。道歉。