使用扫描仪时清除输入缓冲区

时间:2015-04-12 13:29:38

标签: java input buffer clear

我有一个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);
    }
}

3 个答案:

答案 0 :(得分:1)

您可以清除catch块的输入。如果您不想要除整数之外的任何内容,那么只需在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;
    }

答案 1 :(得分:0)

您应该在您的例外catch条款中添加data.next()data.nextLine()

选择哪一种取决于输入的类型以及您期望的错误类型。如果您希望在同一行上有更多输入,例如:

XXXX 1234
5678

然后只有data.next()才会正常运行,因为它会跳过XXXX,下一个标记将是1234,这就是你想要的。

如果您在这种情况下使用data.nextLine(),则会跳过XXXX1234 - 一直到行结束,下一个要读取的标记将为{ {1}}。

答案 2 :(得分: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);
    }
}