为什么nextLine()返回一个空字符串?

时间:2013-04-16 15:08:52

标签: java

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

我的输入包含一个带数字的第一行(要读取的行数),带有数据的一串行和仅带有\ 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 + "<");
}

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

3 个答案:

答案 0 :(得分:35)

nextInt未读取以下换行符,因此第一个nextLinewhich returns the rest of the current line)将始终返回空字符串。

这应该有效:

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

但我的建议是不要将nextLinenextInt / nextDouble / next /等混合在一起,因为任何试图维护代码的人(包括你自己)可能都不是意识到或已经忘记了上述内容,因此可能会对上述代码感到有些困惑。

所以我建议:

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

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

答案 1 :(得分:1)

我想我以前见过这个问题。我认为您需要添加其他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 + "<");
}

答案 2 :(得分:0)

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

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

至于我,它更具可读性,甚至可以节省你的时间,在极少数情况下,当测试用例不正确时(在文件末尾有额外的信息)

顺便说一下,您似乎参加了一些编程竞赛。请注意,扫描仪输入大量数据可能会很慢。您可以考虑使用BufferedReader可能StringTokenizer(此任务中不需要)