Java 在try/catch块上循环?

Java 在try/catch块上循环?,java,exception,try-catch,Java,Exception,Try Catch,我试图编写一个如下所示的try-catch块,但将其放入一个循环中。我的问题是,当我把它放在while循环中时,它会运行x次。我希望它在第一次尝试成功时停止。但可以选择最多运行3次 try { myDisplayFile(); } catch (FileNotFoundException e1) { System.out.println("could not connect to that file..");

我试图编写一个如下所示的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();
}
int max_number_runs=3;
布尔成功=假;
对于(int num\u try=0;!success&&num\u try
int someCounter=0;
布尔完成=假;
while(someCounter<3&&!已完成){
试一试{
//可能引发异常的东西
完成=正确;
}抓住(一些例外){
//一些异常处理
someCounter++;
}
}
你可以
breaktry-catch
块中的code>将退出它所在的循环(不仅仅是
try-catch
块),但是从可读性的角度来看,这个发布的代码可能更好

finished=true
应该是
try
块的最后一行。它不会抛出异常。并且,只有当每隔一行
try
块在没有
异常的情况下执行时,它才会执行。因此,如果进入
finished=true
,则不会抛出和异常,因此可以切换标志并退出循环

否则,如果抛出异常,
finished=true行将不会执行。您将处理异常,然后递增
someCounter++
变量


从可读性的角度来看,这是理想的,因为所有可能的
while
循环出口都标记在
while
循环的条件部分。循环将继续,直到
someCounter
太大,或者
finished
返回true。因此,如果我正在阅读你的代码,我所要做的就是在你的循环中查找修改这些变量的部分,我可以很快理解循环逻辑,即使我还不了解循环正在做的一切。我不必寻找突破语句。

我希望我正确理解了您的问题。有个办法

    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++;
    }
int noOfTries=0;
布尔donewithmysuff=false;
最终int MAX_LOOP_VAL=10;
int-noops=0;
while(noOfTries<3&&noOfLoops
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++;
    }
}
    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++;
    }