如何确保Scanner hasNextInt()要求新输入?

时间:2014-09-21 19:18:20

标签: java input token java.util.scanner

新程序员在这里。这可能是一个非常基本的问题,但它仍然困扰着我。

我要做的是编写一个只提供一个整数输入的方法,这样我就可以在主程序中使用该输入,而不必使用非整数输入。然而,即使用自己的方法编写方法也是有问题的。

public static int goodInput () {
    Scanner input = new Scanner (System.in); //construct scanner
    boolean test = input.hasNextInt(); //set a sentinel value
    while (test == false) { //enter a loop until I actually get an integer
        System.out.println("Integers only please"); //tell user to give me an integer
        test = input.hasNextInt(); //get new input, see if it's an integer
    }
    int finalInput = input.nextInt(); //once i have an integer, set it to a variable
    input.close(); //closing scanner
    return finalInput; //return my integer so I don't have to mess around with hasNextInt over there
}

这似乎在多个级别被打破,但我不确定为什么。

如果我在第一次要求输入时输入0或1之类的整数值,它应该完全跳过循环。但是,相反,它进入循环,并打印“仅请整数”。更糟糕的是,当我在那里时,它实际上并没有要求输入,只是反复打印该行。

我理解后一个问题可能是由于令牌问题,但我不一定确定如何解决它们;关闭然后重新打开扫描程序会让Eclipse错过“重复对象”,简单地将旧输入分配给垃圾字符串变量从未使用过,告诉我“在运行时没有找到行”,而且我没有足够的经验想一想获得新意见的其他方法。

即使一旦解决了,我也需要找到一些方法来避免在有整数的情况下进入循环。我真的不明白为什么整数输入在循环之间开始,所以我不确定这是怎么可能的。

请帮帮忙?对不起,如果这是一个老问题;试着看过去的问题,但似乎没有一个问题与我有相同的问题。

2 个答案:

答案 0 :(得分:3)

你很亲密:这对我来说很好:

Scanner input = new Scanner(System.in); //construct scanner
while(!input.hasNextInt()) {
    input.next(); // next input is not an int, so consume it and move on
}
int finalInput = input.nextInt();
input.close(); //closing scanner
System.out.println("finalInput: " + finalInput);

通过在while循环中调用input.next(),您将使用非整数内容并再次尝试,直到下一个输入为int。

答案 1 :(得分:0)

//while (test == false) {                         // Line #1
while (!test) { /* Better notation */             // Line #2
    System.out.println("Integers only please");   // Line #3
    test = input.hasNextInt();                    // Line #4
}                                                 // Line #5

问题在于,在上面的第4行中,input.hasNextInt()仅测试是否输入了整数,并且不要求新的整数。如果用户输入的内容其他而不是整数,hasNextInt()会返回false而您无法请求nextInt(),因为这会引发InputMismatchException,因为Scanner仍然期望一个整数。

您必须使用next()代替nextInt()

while (!input.hasNextInt()) {
    input.next();
    // That will 'consume' the result, but doesn't use it.
}
int result = input.nextInt();
input.close();
return result;