2016-10-26 3 views
1

Это простая java-функция, принимающая вход в double. Он принимает вход и сначала проверяет, является ли значение нечисловым. И затем проверьте, больше ли значение 0 или нет.бесконечный цикл на нечисловом вводе в java

Проблемы Я облицовка каждый раз, когда я вхожу нечисловой вход, он запускает бесконечный цикл и печатать только "Enter a number greater or equal to 1.0: "

double getInput(double n) { 
    Scanner kbd = new Scanner(System.in); 
    boolean flag = false; 
    boolean check = false; 
    while (!flag) { 
     System.out.println("Enter a number greater or equal to 1.0: "); 
     try { 
      n = kbd.nextDouble(); 
      if (n >= 0 || n < 0) 
       check = true; 
     } catch (InputMismatchException ex) { 
      err.print("Invalid Data Type (not Numeric)"); 
     } 
     if (check == true) { 
      if (n < 0) 
       System.out.println("Invalid value (too small)"); 
      else 
       flag = true; 
     } 
    } 
    return n; 
} 

ответ

0

kbd.nextDouble не потребляет символы новой строки, следовательно, они будут неоднократно проходили в цикл while.

В вашем блоке catch вместо того, чтобы просто исключать исключение, вы можете передать kbd.nextLine(), чтобы в следующем цикле ваш метод ввода был готов.

catch(InputMismatchException ex) 
      { 

       System.out.println("Invalid Data Type (not Numeric)"); 
       kbd.nextLine(); 
      } 

Вот полный код для вас:

double getInput(double n) 
    { 

     Scanner kbd = new Scanner(System.in); 
     boolean flag =false; 
     boolean check = false; 
     while(!flag) 
     { 
      System.out.println("Enter a number greater or equal to 1.0: "); 
      try 
      { 

       n = kbd.nextDouble(); 

       if(n>=0 || n<0)check = true; 
      } 
      **catch(InputMismatchException ex) 
      { 

       System.out.println("Invalid Data Type (not Numeric)"); 
       kbd.nextLine(); 
      }** 

      if(check==true) 
      { 
       if(n<0) 
       System.out.println("Invalid value (too small)"); 
       else 
        flag = true; 
      } 
     } 
    return n; 
    } 
+0

я хочу принять ввод, пока правильное значение не вводится –

+0

Таким образом, даже при вводе правильного входа в следующий раз, ваш код разве работает? –

+0

его работа, если я ввожу правильный номер –

0

Чтения двойного значения от сканера обыкновения читать конец строки

n = kbd.nextDouble(); 

поэтому объект сканера будет иметь что-то прочитайте, если вы не получите строку, заканчивающуюся вызовом

kbd.nextLine(); 

логик точка, чтобы сделать это именно после того, как исключение приходит ...

catch (InputMismatchException ex) { 
     System.err.print("Invalid Data Type (not Numeric)"); 
     kbd.nextLine(); ///here!!! 
     } 
Смежные вопросы