2015-04-12 2 views
2

У меня есть код Java, и там я хочу взять целое число от пользователя. Если этот ввод является целым числом, то его тонкий контроль будет проходить дальше, но если вход отличается от целого, элемент управления снова будет проверяться. Проблема в том, что пользователю задается не целое число, а цикл while повторяется снова и снова. Как решить? Пожалуйста, помогите мне.Очистка входного буфера при использовании сканера

Я постарался ответить на вопрос на этом сайте, но не получил никакого результата.

Вот мой код-

import java.io.* ; 
import java.util.Scanner; 

class A{ 
    int name; 
    int take_int(){ 

     Scanner data=new Scanner(System.in); 
     //BufferedWriter BW=new BufferedWriter(); 


    while(true){ 
     int fault_res=0 ; 
     try{ 
      System.out.print("Enter A Number : "); 
      //BW.flush();   
      name=data.nextInt(); // comment : if user give an alphabet 
           // then the control rounds again and 
           // again, how to solve? System is not 
           // taking any input after entering 
           // any alphabet first time, but it 
           // should take as per my code, I 
           // think is is happening due to i/p 
           // buffer, unable to delete it. 

     } 
     catch(Exception E){ 
      System.out.println("\nSomething Went Wrong !!\nRetry Please !!!"); 
      fault_res=1 ; 
     } 
     if(fault_res==0){break ;} 
    } 
    System.out.println("\nnumber at other class "+name); 
    return name ; 
    } 
} 
class sn{ 
    public static void main(String args[]){ 
     A obA=new A(); 
     int number=obA.take_int(); 
     System.out.println("\nYou have entered "+number); 
    } 
} 

ответ

1

Вы можете очистить вход от улова блока. Если вы не хотите ничего, кроме целого числа, просто сделайте inputStream.nextLine(); в своем блоке catch.

Вот общий фрагмент для ввода только целочисленного ввода.

private static int takeOnlyIntegerInput() { 
     Scanner keyboard = new Scanner(System.in); 
     boolean isValid = false; 
     int num=-1; 
     while (isValid == false) { 
      System.out.print("Please enter an: "); 
      try { 
       num = keyboard.nextInt(); 
       isValid = true; 
      } catch (InputMismatchException ex) { 
       System.out.println("Wrong input. Ony integer input will be processed."); 
       //clean up the garbage input 
       keyboard.nextLine(); 
      }finally{ 
       keyboard.close(); 
      } 
     } 
     return num; 
    } 
+0

Что задает клавиатура.close() ?? –

+0

Он закрывает поток. Выполнение 'keyboard.close' является частью« хорошей практики ». Это не требуется (для правильности программы), но это избавляет программу от утечки памяти. – Nirmal

0

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

Какой из них выбрать, зависит от типа ввода и каких ошибок вы ожидаете. Если вы ожидаете больше входного сигнала на той же строке, например:

XXXX 1234 
5678

только тогда data.next() будет работать правильно, потому что он будет пропускать XXXX и следующий маркер будет 1234 который, что вы хотите.

Если вы используете data.nextLine() в этом случае, то оба XXXX и 1234 будут пропущены - все до конца строки, а следующий маркер для чтения будет 5678.

+0

Да. Но я хочу сделать это, очистив входную буферную память, в которой будет выгружено ранее введенное письмо или другие символы, чем целое, и в буфере памяти ничего не будет видно для последующего сканирования. –

+0

Ну, вот как вы это делаете - вызовите либо 'data.next()', либо 'data.nextLine()', не делая ничего со значением. 'data.next()' очистит все до следующего разделителя, 'data.nextLine()' очистит все до конца строки. – RealSkeptic

0

Перепишите свою программу следующим образом, и она будет работать.

import java.io.* ; 
import java.util.Scanner; 

class A{ 
    int name; 
    int take_int(){ 

    Scanner data=new Scanner(System.in); 

    while(true){ 
     int fault_res=0 ; 
     try{ 
      System.out.print("Enter A Number : "); 
      String input = data.nextLine();   
      name=Integer.parseInt(input); 

     } 
     catch(Exception E){ 
      System.out.println("Something Went Wrong !! Retry Please !!!"); 
      fault_res=1 ; 
     } 
     if(fault_res==0){break ;} 
    } 
    System.out.println("\nnumber at other class "+name); 
    return name ; 
    } 
} 
class sn{ 
    public static void main(String args[]){ 
     A obA=new A(); 
     int number=obA.take_int(); 
     System.out.println("\nYou have entered "+number); 
    } 
} 
Смежные вопросы