2015-02-07 2 views
3

Моя программа должна принимать переменную с плавающей запятой, а затем выйти. Однако я занимаюсь некоторыми материалами обработки исключений и обнаружил проблему. Всякий раз, когда вы вводите письмо в эту программу, программа, конечно, генерирует исключение InputMismatchException, но оно застревает внутри бесконечного цикла. Я полагаю, что моя проблема основана на моем непонимании операторов try-catch и обработки исключений.Переменные с плавающей запятой и обработка исключений

public static void main(String [] args){ 

    Scanner reader = new Scanner(System.in); 
    boolean done = false; 

    do{ 
     try{ 
      System.out.print("Enter a number: "); 
      float number = reader.nextFloat(); 
      done = true; 
     } 
     catch (Exception e){ 
      System.out.println("uh oh"); 
     } 
    }while(!done); 
} 

Эта проблема не возникает, если я использую другой тип переменной, так что я не уверен, если это логическая ошибка или просто что-то в стиле фанк с плавающей точкой переменных.

+1

Что вы подразумеваете под «бесконечной петлей»? Вы получаете какой-то результат? –

+0

Да, я снова и снова получаю заявление «Введите число: uh oh». –

ответ

5

Float#nextFloat() не использует токен в Scanner, если он выбрасывает InputMismatchException. Поэтому, когда вы получаете исключение и цикл (потому что done по-прежнему false), попробуйте снова позвонить nextFloat(). Поскольку токен по-прежнему не является значением, которое может обрабатываться в float, то Scanner снова выдает исключение. И снова, и снова, ad nauseam.

Вы должны использовать hasNextFloat(), чтобы проверить наличие токена, который можно разобрать до значения float. Или используйте неправильное значение с Scanner#next(), как предложено Quirliom.

+0

Стоит отметить, что если 'hasNextFloat()' возвращает false, входной поток должен быть перемещен с помощью 'next()' ... – Sinkingpoint

+0

Спасибо, ребята, за помощь! Я заработал. –

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