有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

扫描器类上的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) 个答案

  1. # 1 楼答案

    这个问题有三个方面:

    • nextInt只使用组成下一个整数的字符,并且不会超过这个数字
    • nextLine一直使用字符,直到到达下一个新行字符。它还使用新行字符
    • ^默认情况下,{}将新行视为分隔符

    假设代码已经运行到第boolean isInt = sc.hasNextInt();行,您输入了d并按下了enter键(即循环的第四次迭代)。此时,扫描仪的内部状态可以可视化为:

    3 \n d \n
     ^
    

    \n表示新行字符,^表示扫描仪当前扫描的位置。对nextInt的最后一次调用使用了3,但没有使用它后面的新行,这会导致扫描仪处于当前位置

    现在,下一个令牌d被扫描(但没有被消耗!)。它不是int,因此hasNextInt返回false。执行else块。将打印错误消息nextLine消耗所有内容,直到下一个新行字符,包括新行字符,它将指针移动到:

    3 \n d \n
        ^
    

    现在我们在循环的下一次迭代中,下一个标记仍然是d,所以同样的事情再次发生。你的else块运行,错误消息打印,nextLine消耗,指针移动:

    3 \n d \n
             ^
    

    将此与nextLineelse之外的情况进行比较。这意味着每次调用hasNextInt时,指针将始终位于\n之后。指针总是被循环上一次迭代的nextLine移动到\n之后。换句话说,在循环的每次迭代中,您总是使用数字后面的新行