2015-03-11 1 views
0

Ниже приведен фрагмент кода, который вызывает бесконечный цикл, когда я вводил символ. Это действительно странно для меня, потому что неправильный номер работает нормально, но когда я вхожу в любой символ, он вызывает бесконечный цикл.Хотя цикл с try/catch вызывает бесконечный цикл

boolean checkValue = false; 

Scanner console = new Scanner(System.in); 
    while (!checkValue) { 

System.out.println("Enter 1, 2 or 3");  

    try { 
      input = console.nextInt(); 

     switch (input) { 
      case 1: 
       // code 
       checkValue = true; 
       break; 
      case 2: 
       // code 
       checkValue = true; 
       break; 
      case 3: 
       // code 
       checkValue = true; 
       break; 

      default: // when entered a wrong number 
       System.err.println("Wrong Input"); 
       checkValue = false; 
     } 
     } 

      catch(Exception e) { // when entered a character 

       System.err.println("Wrong Input"); 
       checkValue = false; 

      } 
    }  
+3

Вы не измените значение Auswahl, есть ваша проблема. – Stultuske

+0

Как вы это понимаете? – Panther

+0

Зачем ради бога? Auswahl ?? – drgPP

ответ

1

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

public static void main(String[] args) { 
    boolean checkValue = false; 
    int input; 

    Scanner console = new Scanner(System.in); 
    while (!checkValue) { 

     System.out.println("Enter 1, 2 or 3");  

     // Check if we have an integer 
     if (console.hasNextInt()) { 
      input = console.nextInt(); 

      switch (input) { 
      case 1: 
       // code 
       checkValue = true; 
       break; 
      case 2: 
       // code 
       checkValue = true; 
       break; 
      case 3: 
       // code 
       checkValue = true; 
       break; 

      default: // when entered a wrong number 
       System.err.println("Wrong Input"); 
       checkValue = false; 
      } 
     } 
     else { 
      // when entered a character 
      System.err.println("Wrong Input"); 
      // Consume the wrong input. 
      console.next(); 
      checkValue = false; 
     } 
    } 
} 
+0

Спасибо за это это улучшение. – Panther

1

Вы назначьте вход в одну переменную:

 input = console.nextInt(); 

Но заявление переключатель проверяет другую переменную:

switch (auswahl) { 

EDIT:

Добавить console.nextLine() в обработчик исключений , чтобы уничтожить конец текущей линии, чтобы разрешить следующий nextInt для чтения со следующей строки.

+0

Извините, не удалось перевести все, что auswahl - это немецкое слово для ввода. но проблема все еще существует. – Panther

+0

@Panther добавьте 'console.nextLine()' к вашему обработчику исключений, чтобы уничтожить конец текущей строки. – Eran

+0

Спасибо, это работает. – Panther

1

Что такое "auswha1"? Его значение не обновляется, и ваш сканер выходит за пределы цикла. Кроме того, вы уверены, что тестируете персонажа в своем коммутаторе? Это похоже на int.

Edit: Инстанцировать новый сканер перед вызовом nextInt, он должен работать:

try { 
    Scanner console = new Scanner(System.in); 
    int input = console.nextInt(); 
    switch (input) { 
     ... 
+0

Извините, не удалось перевести все, что auswahl является немецким словом для ввода. но проблема все еще существует. – Panther

+0

Я отредактировал свой ответ с чем-то, что работает для меня :) – Jejefcgb

0

Auswahl переменная не назначается с входом. На самом деле эта переменная даже не в сцене, пока вы ее не используете в коммутаторе.

boolean checkValue = false; 
     int input; 
     Scanner console = new Scanner(System.in); 
      while (!checkValue) { 

     System.out.println("Enter 1, 2 or 3");  

      try { 
        input = console.nextInt(); 

       switch (input) { 
        case 1: 
         // code 
         checkValue = true; 
         break; 
        case 2: 
         // code 
         checkValue = true; 
         break; 
        case 3: 
         // code 
         checkValue = true; 
         break; 

        default: // when entered a wrong number 
         System.err.println("Wrong Input"); 
         checkValue = false; 
       } 
       } 

        catch(Exception e) { // when entered a character 

         System.err.println("Wrong Input"); 
         checkValue = false; 

        } 
      System.out.println("Program Ends"); 
+0

Извините, пропущено, чтобы перевести все auswahl - это немецкое слово для ввода. но проблема все еще существует. – Panther

+0

Даже я очень новичок в StackOverflow. Проведите тщательное исследование и анализ перед публикацией таких вопросов. Вы не будете оценены здесь, если вы опубликуете такие глупые вещи. Я понимаю, что вы здесь новичок, но помните об этом и все самое лучшее. Cheers @Panther – kiDDevil

0
boolean checkValue = true; 

Scanner console = new Scanner(System.in); 
while (checkValue) { 

System.out.println("Enter 1, 2 or 3");  

    try { 
      input = console.nextInt(); 

     switch (input) { 
      case 1: 
       // code 
       checkValue = false; 
       break; 
      case 2: 
       // code 
       checkValue = false; 
       break; 
      case 3: 
       // code 
       checkValue = false; 
       break; 

      default: // when entered a wrong number 
       System.err.println("Wrong Input"); 
       checkValue = false; 
     } 
     } 

      catch(Exception e) { // when entered a character 

       System.err.println("Wrong Input"); 
       checkValue = false; 

      } 
    }  
+0

что изменилось в коде? – Panther

+0

«Правильное» состояние находится на правом входе. Попытайтесь сказать мне, работает ли это. Я отредактировал условие выхода после правильного ввода. –

+1

Да, проверено. Оно работает. – Panther

0

Вы, вероятно, получить java.util.InputMismatchException после ввода какого-либо противоправного характера. Он не очищает входной буфер, поэтому вызов nextInt() вызывает ту же ошибку и т. Д. Добавить console.next(); в предложение catch, чтобы пропустить неправильный символ.

0

Это будет работать

catch (Exception e) { // when entered a character 

      System.err.println("Wrong Input"); 
      checkValue = false; 
      console = new Scanner(System.in);//Edit 

} 
+0

цикл не должен прерываться, пользователь должен попытаться ввести правильный ввод. – Panther

1

Поскольку вы используете console.nextInt(), вы будете читать только целые числа на входе. Затем, когда вы вводите что-то, что не является int, вы получаете исключение. Там вам нужно потреблять плохой ввод, например. с nextLine():

 catch(Exception e) { // when entered a character 
      System.err.println("Wrong Input"); 
      checkValue = false; 
      console.nextLine(); // <=== add 
     } 

Тогда он работает ...

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