Java中nextLine方法无法读入字符串的问题
时间:2021/03/05
一.问题描述
今天在做OJ题时遇到使用nextLine方法读取一整行输入时为空字符串的情况,具体代码如下:
Scanner in = new Scanner(System.in); HashMap<String, String> map = new HashMap<>(); int n = in.nextInt(); for(int i = 0; i < n; i++){ String str = in.nextLine(); String[] s = str.split(" "); map.put(s[0], str); }
按照提议是先读取一个数字N表示输入学生信息的个数,之后再读取学生信息。
但是经过调试发现读取的第一个str为空字符串,之后能够正常读取字符串。
二.问题原因
经过从网上查询资料,了解到Scanner是一个扫描器,它扫描数据都是去内存中一块缓冲区中进行扫描并读入数据的,而我们在控制台中输入的数据也都是被先存入缓冲区中等待扫描器的扫描读取。这个扫描器在扫描过程中判断停止的依据就是“空白符”,空格、回车等都算作是空白符。
上面代码中的nextInt方法在扫描到有效字符后会将回车符留在缓冲区中,这就导致下面for循环中nextLine读的第一个数据就是换行符,所以读入的是空字符串。
next()与nextLine()的区别
- next()方法在读取内容时,会过滤掉有效字符前面的无效字符,对输入有效字符之前遇到的空格键、Tab键或Enter键等结束符,next()方法会自动将其过滤掉;只有在读取到有效字符之后,next()方法才将其后的空格键、Tab键或Enter键等视为结束符;所以next()方法不能得到带空格的字符串。
- nextLine()方法字面上有扫描一整行的意思,它的结束符只能是Enter键,即nextLine()方法返回的是Enter键之前没有被读取的所有字符,它是可以得到带空格的字符串的。
- next()方法在扫描到空白符的时候会将前面的数据读取走,但会丢下空白符“\r”在缓冲区中
- nextLine()方法在扫描的时候会将扫描到的空白符一同清理掉
三.问题解决
在nextInt方法下面加一个nextLine方法用来清理空白符。
修改后的代码如下:
Scanner in = new Scanner(System.in); HashMap<String, String> map = new HashMap<>(); int n = in.nextInt(); String empty = in.nextLine(); //清理nextInt方法留下的空白符 for(int i = 0; i < n; i++){ String str = in.nextLine(); String[] s = str.split(" "); map.put(s[0], str); }
努力,向上,自律