2015-04-12 144 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

您可以从catch块清除输入。如果你不想要除整数以外的任何东西,那么只需在catch块中执行inputStream.nextLine();

这里是一个只接受整数输入的通用代码片段。

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

什么是keyboard.close()的工作? –

+0

它关闭流。做'keyboard.close'是“好习惯”的一部分。它不是必需的(对于程序的正确性),但它可以避免内存泄漏。 – Nirmal

0

您应该添加,在异常的catch条款,无论是data.next()data.nextLine()

他们选择哪一种取决于输入的类型和您期望的错误类型。如果你希望在同一行更多的投入,例如:

XXXX 1234 
5678

那么只有data.next()将正常工作,因为它会跳过XXXX和下一个标记将1234这是你想要的。

如果在这种情况下使用data.nextLine(),那么这两个XXXX1234会被跳过 - 一切,直到行的结束,要读取的下一个标记将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); 
    } 
}