此程序要求用户输入其学生证号码,该号码必须为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);
}
}
答案 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()
如预期返回了true
,anding
的结果{{1带有true
的}}是(studentID > 999999)
。因此,代码将永远不会进入false
循环,而移至碰巧的下一行,
while
由于输入的值不是studentID = input.nextInt();
,这将抛出InputMismatchException