扫描器类上的java Else条件混淆
请检查else条件的sc.nextLine(),这里我给出10个数字,然后得到它们的总和。如果提供任何无效数据(不是int),它将转到else条件。 考虑输入为: 1. 2. 3. D 然后,它会两次显示无效的数据行。如果我把sc.nextLine()放在外面,它就可以正常工作。 我想知道两次印刷背后的逻辑
导入java。util。扫描仪
public class Main {
public static void main(String[] args) {
int count = 0;
int sum = 0;
Scanner sc = new Scanner(System.in);
while (true) {
System.out.print("Enter number " + (count + 1) + " - ");
boolean isInt = sc.hasNextInt();
if (isInt) {
int num = sc.nextInt();
sum += num;
count++;
if (count == 10) {
break;
}
} else {
System.out.print("Invalid number, put int");
sc.nextLine();
}
// sc.nextLine();
}
System.out.println(sum);
sc.close();
}
}
# 1 楼答案
这个问题有三个方面:
nextInt
只使用组成下一个整数的字符,并且不会超过这个数字李>nextLine
一直使用字符,直到到达下一个新行字符。它还使用新行字符假设代码已经运行到第
boolean isInt = sc.hasNextInt();
行,您输入了d
并按下了enter键(即循环的第四次迭代)。此时,扫描仪的内部状态可以可视化为:\n
表示新行字符,^
表示扫描仪当前扫描的位置。对nextInt
的最后一次调用使用了3
,但没有使用它后面的新行,这会导致扫描仪处于当前位置现在,下一个令牌
d
被扫描(但没有被消耗!)。它不是int,因此hasNextInt
返回false。执行else
块。将打印错误消息nextLine
消耗所有内容,直到下一个新行字符,包括新行字符,它将指针移动到:现在我们在循环的下一次迭代中,下一个标记仍然是
d
,所以同样的事情再次发生。你的else
块运行,错误消息打印,nextLine
消耗,指针移动:将此与
nextLine
在else
之外的情况进行比较。这意味着每次调用hasNextInt
时,指针将始终位于\n
之后。指针总是被循环上一次迭代的nextLine
移动到\n
之后。换句话说,在循环的每次迭代中,您总是使用数字后面的新行