2017-02-06 9 views
3

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

Проблема в том, что всякий раз, когда я запускаю это, он сразу пробегает цикл while и увеличивает счет до 2 и прерывает цикл. Вы можете ввести один неплавающий, прежде чем он отменяет.

 while(true){ 
     try{ 
      sum+= inRead.nextFloat(); 
     } 
     catch (InputMismatchException e){ 
      if (count == 2){ 
       System.out.println(sum); 
       break; 
      } 
      else{ 
       count+=1; 
      } 
     } 
    } 

EDIT: Как некоторые из вас уже указывали на то, что счетчик должен быть инициализирован перед время цикла

Scanner inRead = new Scanner(System.in); 
    float sum = 0; 
    int count = 0; 
    while(true){ 
     try{ 
      sum+= inRead.nextFloat(); 
     } 
     catch (InputMismatchException e){ 
      if (count == 2){ 
       System.out.println(sum); 
       break; 
      } 
      else{ 
       count+=1; 
      } 
     } 
    } 
+0

Каково стартовое значение 'count'? –

+0

Где и как вы устанавливаете/сбрасываете значение 'count'? –

+0

Это полный код? – 23k

ответ

1

Попробуйте это:

Scanner inRead = null; 
    float sum = 0; 
    int count = 0; 
    while(true){ 
     try{ 
      inRead = new Scanner(System.in); 
      sum+= inRead.nextFloat(); 
      if(count == 1) { 
       count = 0; 
      } 
     } 
     catch (InputMismatchException e){ 
      if (count == 1){ 
       System.out.println(sum); 
       break; 
      } 
      else{ 
       inRead = null; 
       count+=1; 
      } 
     } 
    } 

Инкременты counter 2 в коде, потому что, когда вы столкнулись с InputMismatchException в методе nextFloat(). второй nextFloat(), который вы встретите, не будет работать, потому что для этого вам нужно создать new Scanner, потому что он вызывает ошибку раньше в вашем цикле, и я добавляю if(count == 1), когда вам нужно сбросить его на , чтобы он мог удовлетворить вашу проблему до остановить и добавить все, когда будут введены два последовательных неплавающих.

+0

Большое вам спасибо. Из любопытства, почему вы делаете «Сканер inRead = null», а затем 'inRead = new Scanner (System.in)'? – nill

+0

Итак, мы избегаем создания многих объектов «Сканера», поэтому мы ставим на него «null», когда знаем, что мы создадим для него еще один. – msagala25

+0

Создание нового «Сканера» каждый раз кажется совершенно ненужным. Если вам нужно пропустить следующий токен, просто вызовите ['.next()'] (http://docs.oracle.com/javase/8/docs/api/java/util/Scanner.html#next--). «Сканер» может даже буферизовать некоторую «System.in», то есть вы можете потерять входы. Должно быть только одно чтение объекта из stdin. – dimo414

0

Вы должны инициализировать count в 0 до того, пока цикл начинается и все идет нормально. Если вы инициализировали count по номеру 1, тогда, когда введено неплавающее число, count становится 2, а в следующий раз, если вы вводите неплавающее число, цикл завершается.

+0

Возможно, вы правы, но мы точно не знаем это прямо сейчас. –

0

Возможно, вы повторно использовали переменную count откуда-то ранее в своем коде, заставляя ее рано разорваться из-за неправильного значения.

Вы должны инициализировать count до 0 и приступать к приращению при вводе неплавающего числа.

Дополнительная информация о вашем коде может помочь решить эту проблему.

-1

Принятый ответ не работает, как и строительство дополнительных Scanner экземпляров may actually discard parts of the input. Я настоятельно рекомендую only ever using one object to read from System.in, так как это возможно (и распространено) для объекта ввода-чтения, например Scanner, для буферизации данных из исходного источника, а замена этого объекта новым экземпляром отбрасывает любой вход, который уже буферизует первый объект.

Также не обязательно получать нужное поведение. Вместо этого используйте .next(), чтобы пропустить следующий токен, если он недопустим, и используйте .hasNextDouble(), чтобы определить, является ли следующий токен допустимым double (а не ловит InputMismatchException).

try (Scanner in = new Scanner(System.in)) { 
    double sum = 0; 
    boolean lastInputBad = false; 
    while (true) { 
    if (in.hasNextDouble()) { 
     sum += in.nextDouble(); 
     lastInputBad = false; 
    } else if (lastInputBad) { 
     break; // break the loop on a subsequent bad input 
    } else { 
     in.next(); // skip first bad input 
     lastInputBad = true; 
    } 
    } 
    System.out.println("Sum of valid inputs: " + sum); 
} 

Следует также отметить, что я использовал double, а не float. Есть, по существу, no reason to use float in modern code; просто придерживайтесь double.