我正在尝试编写如下所示的try catch块,但将其置于循环中。我的问题是,当我把它放在while循环中时,它会运行x次。我希望它在第一次尝试成功时停止。但是可以选择最多运行3次。
try {
myDisplayFile();
} catch (FileNotFoundException e1) {
System.out.println("could not connect to that file..");
e1.printStackTrace();
}
public static void myDisplayFile() throws FileNotFoundException{
Scanner kin = new Scanner(System.in);
System.out.print("Enter a file name to read from:\t");
String aFile = kin.nextLine();
kin.close();
Scanner fileData = new Scanner(new File(aFile));
System.out.println("The file " + aFile + " contains the following lines:");
while (fileData.hasNext()){
String line = fileData.next();
System.out.println(line);
}//end while
fileData.close();
}
答案 0 :(得分:2)
int max_number_runs = 3;
boolean success = false;
for( int num_try = 0 ; !success && num_try < max_number_runs ; num_try++ )
{
try
{
/* CODE HERE */
success = true;
}
catch( Exception e )
{
}
}
答案 1 :(得分:1)
int someCounter = 0;
boolean finished = false;
while(someCounter < 3 && !finished) {
try {
//stuff that might throw exception
finished = true;
} catch (some exception) {
//some exception handling
someCounter++;
}
}
你可以在break;
块内try catch
它将退出它所在的循环(不仅仅是try catch
块),但从可读性的角度来看,这个发布的代码可能会更好。
finished = true
应该是try
块的最后一行。它不会抛出异常。并且只有在try
块的每隔一行执行时才会执行exception
。因此,如果你到达finished = true
,你就不会抛出异常,所以你可以切换你的旗帜并退出循环。
否则,如果抛出异常,finished = true;
行将不会执行。您将处理异常,然后递增someCounter++
变量。
从可读性的角度来看,这是理想的,因为所有可能的while
循环退出都标记在while
循环的条件部分中。循环将继续,直到someCounter
太大或finished
返回true。因此,如果我正在阅读您的代码,我所要做的就是通过循环查看修改这些变量的部分,并且我可以快速理解循环逻辑,即使我还不了解循环所做的一切。我不必寻找break;
陈述。
答案 2 :(得分:0)
我希望我能正确理解你的问题。这是一种方式。
int noOfTries = 0;
boolean doneWithMyStuff = false;
final int MAX_LOOP_VAL = 10;
int noOfLoops = 0;
while(noOfTries < 3 && noOfLoops < MAX_LOOP_VAL && !doneWithMyStuff) {
try {
// Do your stuff and check success
doneWithMyStuff = true;
}
catch (Exception e) {
noOfTries++;
e.printStackTrace();
}
finally {
// Close any open connections: file, etc.
}
noOfLoops++;
}