为什么 nextLine() 返回空字符串? [重复]

问题描述 投票:0回答:3

这可能是最简单的事情之一,但我没有看到我做错了什么。

我的输入由带有数字的第一行(要读取的行数)、一堆带有数据的行和仅带有

\n
的最后一行组成。我应该处理这个输入,并在最后一行之后,做一些工作。

我有这样的输入:

5
test1
test2
test3
test4
test5
      /*this is a \n*/

为了读取输入,我有这个代码。

int numberRegisters;
String line;

Scanner readInput = new Scanner(System.in);

numberRegisters = readInput.nextInt();

while (!(line = readInput.nextLine()).isEmpty()) {
    System.out.println(line + "<");
}

我的问题是为什么我不打印任何东西?程序读取第一行,然后不执行任何操作。

java java.util.scanner
3个回答
53
投票

nextInt
不会读取以下换行符,因此第一个
nextLine
返回 current的其余部分)将始终返回空字符串。

这应该有效:

numberRegisters = readInput.nextInt();
readInput.nextLine();
while (!(line = readInput.nextLine()).isEmpty()) {
    System.out.println(line + "<");
}

但我的建议是不要将

nextLine
nextInt
/
nextDouble
/
next
/ 等混合使用,因为任何试图维护代码的人(包括你自己)可能不知道或忘记了上述内容,所以上面的代码可能有点令人困惑。

所以我建议:

numberRegisters = Integer.parseInt(readInput.nextLine());

while (!(line = readInput.nextLine()).isEmpty()) {
    System.out.println(line + "<");
}

3
投票

我想我以前见过这个问题。 我认为你需要添加另一个

readInput.nextLine()
,否则你只是在
5
的末尾和之后的
\n
之间阅读

int numberRegisters;
String line;

Scanner readInput = new Scanner(System.in);

numberRegisters = readInput.nextInt();
readInput.nextLine();

while (!(line = readInput.nextLine()).isEmpty()) {
    System.out.println(line + "<");
}

0
投票

实际上它并没有完全回答问题(为什么你的代码不起作用),但你可以使用以下代码。

int n = Integer.parseInt(readInput.readLine());
for(int i = 0; i < n; ++i) {
    String line = readInput().readLine();
    // use line here
}

对我来说,它更具可读性,甚至在测试用例不正确的罕见情况下可以节省您的时间(在文件末尾有额外信息)

顺便说一句,你好像参加了一些编程比赛。请注意,扫描仪输入大量数据可能会很慢。您可以考虑将

BufferedReader
与可能的
StringTokenizer
(此任务中不需要)

© www.soinside.com 2019 - 2024. All rights reserved.