首页 > 解决方案 > 为什么即使使用 hasNextInt() 方法我也会收到 inputMismatchException?

问题描述

该程序要求用户输入他们的学生证号码,该号码必须是 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);
    }   

}

标签: javainputmismatchexception

解决方案


问题出在里面的逻辑上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()返回,结果也是. 所以代码永远不会进入循环并移动到下一行,这恰好是,trueandingtrue(studentID > 999999)falsewhile

studentID = input.nextInt();

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


推荐阅读