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

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

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

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错过“重复对象”,只需将旧输入分配给垃圾字符串变量从未使用过,告诉我“在运行时没有找到行”,而且我没有足够的经验想到其他方式来获得新的输入。

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

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

你很亲密:这对我很好:

 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。

 //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;