java - 为什么即使使用 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);
}
}
解决方案
问题出在里面的逻辑上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()
返回,结果也是. 所以代码永远不会进入循环并移动到下一行,这恰好是,true
anding
true
(studentID > 999999)
false
while
studentID = input.nextInt();
这将抛出 aInputMismatchException
因为输入的值不是integer