为什么即使使用 hasNextInt() 方法我也会收到 inputMismatchException?

Why am I getting inputMismatchException even when using hasNextInt() method?

此程序要求用户输入他们的学号,该号必须是 0-999999 之间的整数。已被注释掉的 testID 方法使用带有内部 while 循环的 do while 循环,以确保用户仅输入整数值。这种方法没有任何问题。 在尝试重写代码(第二个 testID 方法)时,每次我 运行 程序并输入字符串或字符值时,我都会得到一个 inputMismatchException。第一种方法不会发生这种情况。有人可以解释为什么会这样吗?

import java.util.*;
public class StudentID{

    public static int studentID= -1;
    public static Scanner input = new Scanner(System.in);

    public static void main(String[] args){
        testID();
    }

    /*
    public static void testID(){
        System.out.println("Enter your Student EMPLID (0-999999):");
        do{
            while (!input.hasNextInt()){
                input.nextLine();
                System.out.println("Enter a valid Student EMPLID (0-999999).");
            }
            studentID = input.nextInt();
            if(0 > studentID || studentID > 999999){
                input.nextLine();
                System.out.println("Enter a valid Student EMPLID (0-999999).");
            }
        } while (0 > studentID || studentID > 999999);
        System.out.println("Student EMPLID: " + studentID);
    }

    */

    public static void testID(){
        System.out.println("Enter your Student EMPLID (0-999999:)");
        while ((!input.hasNextInt()) && (0 > studentID) && (studentID > 999999)){
            input.nextLine();
            System.out.println("Enter a valid Student EMPLID (0-999999:)");
        }
        studentID = input.nextInt();
        System.out.println("Student EMPLID: " + studentID);
    }   

}

问题出在while里面的逻辑上。在注释的 testID() 方法中,您检查了以下条件为真:

while(!input.hasNextInt()) {
    ....
}

因此对于非整数输入,input.hasNextInt() 将 return false!hasNextInput() 将因此 return truewhile 将继续循环,直到输入有效的 integer

现在在情况 2 中,while 中的条件始终为 false,

while(!input.hasNextInt()) && (0 > studentID) && (studentID > 999999) {
    ...
}

看,这里 studentID 默认设置为 -1 因此即使 !input.hasNextInt() return 按预期编辑 true,结果 anding 这个 true(studentID > 999999)false。所以代码永远不会进入 while 循环并移动到下一行,这恰好是

studentID = input.nextInt();

这将抛出 InputMismatchException,因为输入的值不是 integer