关于Java的Scanner扫描器的一个小细节

113 阅读1分钟

关于Java的Scanner扫描器的一个小细节

这是我出现问题的代码:

public class Test {
    public static void main(String[] args) {
        HuffmanClass HFtree = new HuffmanClass();

        // 传入数据
        String str = "aegijlmnoprv ";
        double[] weight = {3, 1, 2, 2, 1, 1, 2, 1, 1, 1, 2, 2, 3};
        HFtree.setData(str.length(), weight, str);
        // 创建哈夫曼树
        HFtree.CreateHT();
        HFtree.CreateHCode();
        Scanner sc = new Scanner(System.in);
        while (true) {
            System.out.println("--------------------------------------------------");
            System.out.println("请输入要选择的功能:");
            System.out.println("1、显示编码表");
            System.out.println("2、编码字符串");
            System.out.println("3、解码二进制编码");
            System.out.println("4、退出");
            System.out.println("--------------------------------------------------");
            System.out.println("                                      ");

            int comment = sc.nextInt();

            switch (comment) {

                case 1:
                    HFtree.DispHuffman();
                    break;

                case 2:
                    System.out.println("请输入要编码的字符串;");
                    String string = sc.nextLine();
                    System.out.println(string + "经过编码后为:");
                    System.out.println(HFtree.Display(string));
                    break;

                case 3:

                    break;

                case 4:
                    System.out.println("退出成功!");
                    return;

                default:
                    System.out.println("输入的数字有误,请重试!");
            }
        }
    }
}

今天,在我写作业的时候,我写了个switch分之,外面是一个死循环,直到我选择4退出,当我运行程序的时候,我选择case2,但是它运行到sc.nextLine()并不会等我输入而是直接进入到了下一次循环,如下图所示:

Snipaste_2023-11-10_17-35-46.jpg

一开始我就纳闷了,怎么都没等我输入就直接跳过了,最后翻看了一下Java的Scanner类,发现了问题的缘由:

当运行到case 2的sc.nextLine()时,可能不会停下来的原因是因为之前的sc.nextInt()方法没有读取完整行的输入。nextInt()方法只会读取一个整数,但不会读取换行符。因此,当程序执行到sc.nextLine()时,它会读取之前剩余的换行符,而不会等待用户输入

所以,要解决这个问题,只需要在想要输入一行数据的地方前面再加一行代码

sc.nextLine();

这样,就能够读取之前nextInt()方法留下的换行符,解决掉这个问题啦