返回

Java Scanner 循环输入无法结束?试试这三个方法

Linux

深入剖析:Java Scanner 循环输入的那些“坑”

对于刚接触 Java 的新手来说,java.util.Scanner 类就像一把万能钥匙,帮助他们轻松地从控制台获取用户输入。然而,这把钥匙偶尔也会卡住锁芯,让初学者们摸不着头脑。其中最常见的问题之一就是:程序无法正常结束,即使输入结束后依然“痴痴地”等待着新的输入。

问题的根源在于 java.util.Scanner 默认会持续监听来自 System.in (标准输入流) 的数据。当你敲下回车键,以为大功告成的时候,Scanner 却仅仅是接收到了一个换行符。对于 nextInt(), nextDouble() 这类方法来说,换行符只是个“无关紧要”的分隔符,而不是输入结束的号令枪。因此,Scanner 会继续“坚守岗位”,等待下一个非空白字符的到来,导致程序陷入无休止的等待。

那么,如何才能让 Scanner 乖乖地结束输入,不再“无理取闹”呢?

方法一:nextLine() - 一网打尽

nextLine() 方法就像一个“强迫症患者”,它会读取整行输入,包括换行符,并将它们打包成一个字符串返回。我们可以利用 nextLine() 的“强迫症”特性,先读取整行输入,然后再使用 Integer.parseInt()Double.parseDouble() 等方法将字符串“翻译”成我们需要的数值类型。

import java.util.Scanner;

public class Main {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);

        System.out.print("请输入学生人数:");
        int numStudents = Integer.parseInt(scanner.nextLine());

        String[] names = new String[numStudents];

        for (int i = 0; i < numStudents; i++) {
            System.out.print("请输入第 " + (i + 1) + " 个学生姓名:");
            names[i] = scanner.nextLine();
        }

        System.out.println("学生姓名列表:");
        for (String name : names) {
            System.out.println(name);
        }
    }
}

方法二:close() - 功成身退

俗话说“君子善始善终”,对于 Scanner 对象来说也是如此。在使用完 Scanner 对象后,我们可以调用其 close() 方法,如同一位功成名就的将军,体面地退出历史舞台。关闭输入流可以确保程序在完成使命后优雅地结束。

import java.util.Scanner;

public class Main {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);

        System.out.print("请输入一个整数:");
        int num = scanner.nextInt();

        System.out.println("你输入的整数是:" + num);

        scanner.close(); // 关闭 Scanner 对象
    }
}

方法三:特定字符 - 约定暗号

除了使用 nextLine()close() 之外,我们还可以预先设定一个“暗号”,例如 “-1” 或 “exit”,作为输入结束的信号。在循环中,我们只需判断用户输入是否等于这个“暗号”,如果是,则意味着任务完成,可以结束循环了。

import java.util.Scanner;

public class Main {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);

        int sum = 0;

        System.out.println("请输入数字 (输入 -1 结束):");

        while (scanner.hasNextInt()) {
            int num = scanner.nextInt();

            if (num == -1) {
                break; // 检测到暗号,跳出循环
            }

            sum += num;
        }

        System.out.println("数字总和为:" + sum);
    }
}

总结

java.util.Scanner 无法结束输入就像一个顽皮的捣蛋鬼,但只要我们了解了他的“脾气”,就能轻松地制服他。选择适合程序逻辑的方法,可以让你的 Java 程序在与用户交互后,平稳地落下帷幕。

常见问题解答

  1. 为什么使用 nextInt() 后程序无法结束?

    因为 nextInt() 只读取整数,不会读取换行符。当用户按下回车键时,换行符会留在输入流中,导致 Scanner 继续等待下一个输入。

  2. nextLine()nextInt() 可以混合使用吗?

    混合使用时需要注意,nextInt() 不会读取换行符,而 nextLine() 会读取换行符。如果在 nextInt() 之后直接使用 nextLine()nextLine() 会读取 nextInt() 留下的换行符,导致输入错误。

  3. 关闭 Scanner 对象会有什么影响?

    关闭 Scanner 对象会同时关闭其关联的输入流 (System.in),这会导致程序无法再从控制台获取任何输入。

  4. 使用特定字符结束输入有什么优缺点?

    优点是简单直观,缺点是用户输入的字符不能与预先设定的“暗号”冲突。

  5. 还有其他方法可以解决 Scanner 无法结束输入的问题吗?

    可以使用 BufferedReader 类读取输入,它提供了更灵活的控制方式。