2016-05-10 2 views
0

Я пытаюсь поймать InputMismatchException, он работает при первом преломлении, но когда метод menu() вызывается снова, он начинает цикл, пока он не застрянет в ошибке.Java try catch (InputMismatchException) неожиданный цикл

В try catch моей целью было получить сообщение об ошибке, а затем снова запустить метод menu().

У меня есть следующий код:

public class Menu extends ProfilesManager { 
    static Scanner sc = new Scanner(System.in); 

    public static void menu() { 

     int number; 
     System.out.println("** Welcome... **\n "); 
     System.out.println("* what you wanna do?:\n"); 
     System.out.println("(1) Login \n(2) Register \n(3) Find User \n(4) Exit\n"); 
     System.out.print("-Answer?: "); 

     try { 
      number = sc.nextInt();    
      if (number == 1) { 
       Login(); 
      } else if (number == 2) { 
       Register(); 
      } else if (number == 3) { 
       FindUser(); 
      } else if (number== 4) { 
       Exit(); 
      }              
     } catch (InputMismatchException e) { 
      System.out.println("Error , only numbers!!"); 
      menu();   
      } 
     } 
    } 
} 
+3

Что такое 'menuPrinc();'? Если вы хотите что-то перезапустить, используйте фактический цикл, а не рекурсию. –

+0

. Мне кажется, вам просто нужно вызвать 'menu()' в блоке 'catch' – Yazan

+0

menuPrinc() - метод menu(), я забыл исправить его, Прости! –

ответ

0

Вы имеете бесконечную рекурсию. Вам нужно переместить меню() из блока catch, если вы хотите снова позвонить ему. В противном случае это бесконечный цикл.

0

Я думаю, вы должны написать sc = new Scanner(System.in); после System.out.println("Error , only numbers!!");

0

Это происходит потому, что, как только вы ввели неверный ввод. вы не очищая ее и Scanner будет продолжать читать, и каждый раз, когда он даст вам InputMisMatchException

Вам нужно очистить его в блоке поймать

}catch(InputMismatchException e){ 

    System.out.println("Error , only numbers!!"); 
    sc.nextLine(); 
    // Put 2 second delay 
    try{ 
     Thread.sleep(2000); 
    }catch(InterruptedException ex){ 
     ex.printStackTrace(); 
    } 
    menu(); 

} 
+0

Это сработало, спасибо! –

+0

Рад, что это вам помогло .. Приветствие ... – Sanjeev

+0

Единственная проблема заключается в том, что сообщение об ошибке не видно, оно прыгает прямо, не показывая его. –