2016-02-22 3 views
0

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

Проблема заключается в том, что мой текущий код неоднократно печатает «Недопустимый формат номера. Попробуйте еще раз». в консоль при вводе неправильного операнда i.e «2a + 2» Я специально попросил использовать nextDouble и следующий в этом сценарии.

Попытавшись исправить это самостоятельно, я убежден, что он вызвал вызов nextDouble и следующий после друг друга, требуя использования nextLine, но я до сих пор не понимаю, почему именно.

public static void main(String[] args) { 

    Scanner in = new Scanner(System.in); 

    boolean repeat = true; 
    double n1,n2; 
    String op; 

    System.out.print("Enter a simple mathematical formula: "); 

    while(repeat){ 
     try{ 

     n1 = in.nextDouble(); 
     op = in.next(); 
     n2 = in.nextDouble(); 

     switch(op){ 
      case "+": 
       System.out.println("Result: " + (n1 + n2)); 
       break; 
      case "-": 
       System.out.println("Result: " + (n1 - n2)); 
       break; 
      case "/": 
       System.out.println("Result: " + (n1/n2)); 
       break; 
      case "*": 
       System.out.println("Result: " + (n1 * n2));      
       break; 
      default: 
       System.out.println("Invalid Operator. Try again."); 
       continue; 
      } 

      repeat = false; 

     }catch(InputMismatchException e){ 
      System.out.println("Invalid number format. Try again."); 
     } 
    } 
    in.close(); 
} 
+0

Как вы вводите данные? Я предполагаю, что вы вводите '2a + ×' за один раз, а затем отбрасываете свой код. Вы должны добавить один операнд/оператор за раз, если хотите сохранить свой код так, как есть. –

ответ

2

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

Чтобы исправить это, просто позвоните .nextLine(), если возникла ошибка, чтобы полностью пропустить входную строку.

Из документации Scanner.nextDouble():

Если перевод успешен, сканер достижения мимо входа, который соответствовал.

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