2013-01-04 3 views
1

Я улавливаю inputMismatchException в моем основном методе и хочу, чтобы мой цикл do-while снова повторялся после исключения. Я даже закодировал явный оператор продолжения, но это не сработало. Как я могу это сделать?Резюме цикла после пойманного исключения

public class AddressBookApp { 

public static void main(String[] args) { 
    AddressBook abook = new AddressBook(); 

    System.out.println("Welcome to the Address Book Application\n"); 
    Scanner sc = new Scanner(System.in); 

    int menuNumber = 4; 
    loop: 
    do { 
     abook.menu(); 

     try{ 
      menuNumber = sc.nextInt(); 
      System.out.println(); 

      if (menuNumber < 1 || menuNumber > 4){ 
       System.out.println("Please enter a valid menu number\n"); 
      } else if (menuNumber == 1) { 
       abook.printEntries(); 
      } else if (menuNumber == 2) { 
       abook.addEntry(); 
      } else if (menuNumber == 3) { 
       abook.removeEntry(); 
      } else { 
       System.out.println("Thanks! Goodbye."); 
       sc.close(); 
       return; 
      } 


     } catch (InputMismatchException ime) { 
      System.out.println("Please enter an integer"); 
      sc.next(); 

      continue loop; 
     } 

    } while (menuNumber != 4); 
    sc.close(); 
    } 
} 

ответ

4

Вы оставили menuNumber равную 4, что является условием завершения вашего цикла. Конечно, ваша петля закончится.

+0

Да, вы правы. Я помещаю это там, прежде чем вставить try-catch, чтобы предотвратить бесконечный цикл. – Keven

+0

menuNumber объявляется вне цикла, а затем увеличивается на вызов sc.nextInt, поэтому он (теоретически) увеличивается. Проблема, которую я вижу и описываю ниже, заключается в том, что забрасывается исключение типа, отличного от того, что он ловит. – CBass

+0

Извините, похоже, что он изменил код после вашего комментария и до моего. – CBass

0

Попробуйте

} catch (InputMismatchException ime) { 
    if (fatal(ime)) { 
     throw ime; 
    } else { 
     // try again 
     continue; 
    } 
1

Вы инициализированному menuNumber до 4, но не изменить его в случае исключения. Цикл пытается продолжить, но завершает работу, потому что оператор menuNumber != 4 является ложным.

int menuNumber = 4; 
loop: 
do { 
    abook.menu(); 

    try{ 
     menuNumber = sc.nextInt(); 
     System.out.println(); 

     if (menuNumber < 1 || menuNumber > 4){ 
      System.out.println("Please enter a valid menu number\n"); 
     } else if (menuNumber == 1) { 
      abook.printEntries(); 
     } else if (menuNumber == 2) { 
      abook.addEntry(); 
     } else if (menuNumber == 3) { 
      abook.removeEntry(); 
     } else { 
      System.out.println("Thanks! Goodbye."); 
      sc.close(); 
      return; 
     } 


    } catch (InputMismatchException ime) { 
     System.out.println("Please enter an integer"); 
     sc.next(); 

     continue loop; 
    } 

} while (menuNumber != 4); 
0

Цикл не продолжается, так как исключается исключение типа OTHER, кроме InputMistmatchException. Измените улов на:

catch (Exception e) 

или, по крайней мере, добавить, что все охватывающее состояние уловов.

Лучшим решением является проверка того, какое исключение выбрасывается и почему, а затем устранить проблему, приводящую к исключению. Наличие всеобъемлющего улова с утверждением continue может теоретически привести к бесконечному циклу, потому что номер меню не увеличивается.

Смежные вопросы