2013-12-06 3 views
4

Я пытаюсь написать блок catch try, как показано ниже, но поставил его внутри цикла. Моя проблема заключается в том, что когда я помещаю ее в цикл while, она запускается х раз. Я хочу, чтобы он остановился, когда первая попытка прошла успешно. но дать возможность работать до 3 раз.цикл за блок try/catch?

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

ответ

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

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++; 
    } 
Смежные вопросы