2014-10-20 3 views
0

Все, что я пытаюсь выполнить с помощью этого кода, это проверить, что вход пользователя - это целое число, а затем дать им 3 шанса при повторном вводе его, если это не правильный тип данных. И затем, наконец, выбросив исключение, если они достигнут отметки «maxTries».Ошибка Java try catch

Любая помощь была бы принята с благодарностью. Приветствия.

boolean correctInput = false;  
    int returnedInt = 0; 
    int count = 0; 
    int maxTries = 3; 

    Scanner kybd = new Scanner(System.in); 

    while(!correctInput) 
    { 
     try 
     { 
      System.out.println("\nInput your int, you have had:" + count + " tries"); 
      returnedInt = kybd.nextInt(); 
      correctInput = true; 

     } 
     catch(InputMismatchException e) 
     { 
      System.out.println("That is not an integer, please try again.."); 
      if (++count == maxTries) throw e; 

     } 

    } 
    return returnedInt; 
+2

В чем проблема с этим кодом? Сообщения об ошибках? Разве это не делает то, что должно быть, и если да, то чем оно занимается? – JJJ

+0

Я думаю, вы не устанавливать correctInput к ложным, так что выскакивает из цикла –

+0

Струнный Это не является целым числом, пожалуйста, попробуйте еще раз .. Input ИНТ, вы имели: 1 пытается Исключение в потоке «Main "java.util.InputMismatchException это не является целым числом, пожалуйста, попробуйте еще раз .. Input ИНТ, вы имели: 2 попытки это не является целым числом, пожалуйста, попробуйте еще раз .. \t в java.util.Scanner .throwFor (Scanner.java:909) \t на java.util.Scanner.next (Scanner.java:1530) на java.util.Scanner.nextInt (Scanner.java:2160) \t в java.util.Scanner.nextInt (Scanner.java:2119) \t в Main.inputInt (Main.java:25) \t в Main.main (Main.java:10) Java Результат: 1 BUILD SUCCESSFUL (общее время: 5 секунд) – user258873

ответ

2

Причина, по которой это происходит, заключается в том, что буфер буфера сканера не очищается. Вход kybd.nextInt() уже заполнен не-int, но так как он не смог его прочитать, он фактически не избавился от него из стека. Таким образом, вторая петля пытается вытащить заполненный буфер, который уже был неправильным, снова.

Чтобы исправить это, вы можете очистить буфер, используя nextLine() в своей обработке исключений.

 } catch (InputMismatchException e) { 
      System.out 
        .println("That is not an integer, please try again.."); 
      kybd.nextLine(); //clear the buffer, you can System.out.println this to see that the stuff you typed is still there 
      if (++count == maxTries) 
       throw e; 

     } 

Другой альтернативой является использование String s = kybd.nextLine() и синтаксического анализа для Integer и поймать исключение из этого вместо этого.

+0

У меня все получилось, что я принимаю динг за -1, но это поможет мне объяснить, почему он заслужил -1. – Compass

+0

Большое вам спасибо! Это обработало cheers =) – user258873

+0

Чтобы проверить это, добавьте строку в предложение catch: System.out.println («input was:» + kybd.next()); '- вы увидите, что ошибочный ввод все еще находится в очереди. По иронии судьбы, это прояснит проблему ... :) –