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

时间:2018-11-13 18:07:22

标签: java inputmismatchexception

此程序要求用户输入其学生证号码,该号码必须为0-999999之间的整数。已注释掉的testID方法使用带有内部while循环的do while循环,以确保用户仅输入整数值。此方法可以正常工作。 每次我运行程序并键入字符串或char值时,尝试重写代码(第二个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);
    }   

}

1 个答案:

答案 0 :(得分:1)

问题出在while内部的逻辑中。在带有注释的testID()方法中,您检查以下条件是否为真:

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

因此对于非整数输入,input.hasNextInt()将返回false,而!hasNextInput()将因此返回true,而while将继续循环直到有效输入了integer

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

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

请参见,此处studentID默认设置为-1,因此,即使!input.hasNextInt()如预期返回了trueanding的结果{{1带有true的}}是(studentID > 999999)。因此,代码将永远不会进入false循环,而移至碰巧的下一行,

while

由于输入的值不是studentID = input.nextInt(); ,这将抛出InputMismatchException