这段代码为什么没有执行while里面的输入就报错了?在while里面不是应该继续等待控制台输入吗?为什么直接往后执行了
应该是因为第13行in.nextLine()这行代码的原因,nextLine()遇到回车就会结束,而前面第8行的in.nextInt()读取一个整数后,丢弃了一个回车键到缓冲区,而这个回车键之前的内容被nextLine读取,但是这个回车之前没有内容,所以返回空字符串,然后遇到后面的代码就报错了。
可以在第8行后,加一句in.nextLine()把前面丢弃的回车键读走即可。
参考资料:
java中next()和nextline()用法区别_做难做的事的博客-CSDN博客_nextline
java 输入 Scanner中 next(),nextInt(),nextLine()辨析_yanerkouxin的博客-CSDN博客_java sc.nextint
Java HashMap getOrDefault() 方法 | 菜鸟教程
Java遍历Map集合的四种方式
Java语言程序设计基础篇(原书第8版) 第9章 字符串和文本I/O 9.7 文件输入和输出 9.7.3 Scanner如何工作(第263页)
测试代码如下:
import java.util.HashMap;
import java.util.HashSet;
import java.util.Map;
import java.util.Scanner;
public class nextLineTest {
public static void main(String[] args) {
// TODO Auto-generated method stub
Scanner in = new Scanner(System.in);
int x = in.nextInt();
in.nextLine();
HashMap<Integer,Long> hashmap = new HashMap();
HashSet<Integer> set = new HashSet();
// https://blog.csdn.net/qq_39593222/article/details/125157841
//https://blog.csdn.net/yanerkouxin/article/details/124000633
//https://www.runoob.com/java/java-hashmap-getordefault.html
//http://c.biancheng.net/view/6872.html
//Java语言程序设计基础篇(原书第8版) 第9章 字符串和文本I/O 9.7 文件输入和输出 9.7.3 Scanner如何工作(第263页)
while(x>0) {
String str = in.nextLine();
String[] s = str.split(" ");
set.add(Integer.parseInt(s[0]));
hashmap.put(Integer.valueOf(s[0]),
hashmap.getOrDefault(Integer.valueOf(s[0]), 0L)+Integer.parseInt(s[1]));
x--;
}
System.out.println("Set集合:");
for(int i:set) {
System.out.print(i+" ");
}
System.out.println("\nMap键值对:");
for(Map.Entry<Integer, Long> entry:hashmap.entrySet()) {
System.out.println(entry.getKey()+":"+entry.getValue());
}
}
}
String str = new Scanner(System.in).nextLine();