这段代码为什么没有执行while里面的输入就报错了?

这段代码为什么没有执行while里面的输入就报错了?在while里面不是应该继续等待控制台输入吗?为什么直接往后执行了

img

应该是因为第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());
        }
    }

}

img

String str = new Scanner(System.in).nextLine();