关于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()并不会等我输入而是直接进入到了下一次循环,如下图所示:
一开始我就纳闷了,怎么都没等我输入就直接跳过了,最后翻看了一下Java的Scanner类,发现了问题的缘由:
当运行到case 2的sc.nextLine()时,可能不会停下来的原因是因为之前的sc.nextInt()方法没有读取完整行的输入。nextInt()方法只会读取一个整数,但不会读取换行符。因此,当程序执行到sc.nextLine()时,它会读取之前剩余的换行符,而不会等待用户输入
所以,要解决这个问题,只需要在想要输入一行数据的地方前面再加一行代码
sc.nextLine();
这样,就能够读取之前nextInt()方法留下的换行符,解决掉这个问题啦