【问题标题】:Java BufferedReader on System.in ignores first line / commandSystem.in 上的 Java BufferedReader 忽略第一行/命令
【发布时间】:2021-01-05 18:34:03
【问题描述】:

我已经为 java 创建了一个简单的控制台应用程序,它使用 JavaBufferedReader 从终端读取命令。由于某种原因,发出的第一个命令总是被完全忽略。即使在调试时没有读取任何值并且输入字符串仍然没有初始化。发出第二个命令后,输入字符串得到我在控制台中写入的值。

我正在使用 IntelliJ 和带有 gradle 和 JDK 11 的集成终端。 我几乎看不出任何原因,为什么第一个命令被完全忽略了。

BufferedReader inReader = new BufferedReader(new InputStreamReader(System.in));

以及主要的shell功能

 public void runMainLoop() throws IOException {
    boolean quit = false;

    while (!quit) {
      System.out.print("prompt> ");
      final String input = inReader.readLine();   // <-- This input gets no value after pressing "enter". 
      if (input == null) {                        // all other "enter" after the first one are working
        break; 
      }

      try (final Scanner scanner = new Scanner(input)) {
        scanner.useDelimiter("\\s+");

        if (!scanner.hasNext()) {
          printError("No command specified!");
          break;
        }

        switch (scanner.next().toLowerCase()) {

          case "help":
            printHelpMessage();
            break;

          case "quit":
            quit = true;
            println("Terminate...");
            break;

          default:
            printError("Unknown command given.");
            printHelpMessage();
            break;
        }
      }
    }
  }

【问题讨论】:

  • 只是评论说我无法使用 IntelliJ 和 JDK 15 重现这一点。
  • “没有价值”是什么意思?它必须是某种东西,或者你的意思是它是NULL?您是否使用调试器遍历代码以查看第一次迭代发生了什么?
  • 调试器甚至不会停在那里。它没有价值。不是 null 或任何东西,只是什么都没有。我很确定,问题不在代码中。它可能与配置有关,但我不知道错误可能出在哪里。
  • 调试器无法识别,我输入了一个命令。调试器显示“应用程序正在运行”。然后我输入一个新命令,所有下一个命令都在工作,并且调试器在输入命令后停止。它只是在第一个之后没有。

标签: java console-application user-input


【解决方案1】:

我建议应用分而治之的调试策略:从可以工作的绝对最小值开始,然后添加部分程序,直到它停止工作。然后检查最后添加的部分。

这对我有用,所以我猜你的问题出在其他地方:

BufferedReader inReader = new BufferedReader(new InputStreamReader(System.in));
String input = inReader.readLine();
System.out.println(input);

【讨论】:

  • 是的,我也认为,它更像是某个地方的配置错误,但我不知道在哪里寻找它。
  • 我试图给你一个工具来找出你的问题在哪里。
  • 我刚刚测试了您的最小代码。出于某种原因,这对我不起作用。我在一个全新的 gradle 项目(Intellij 模板)中,只有您提供的代码。问题:终端从不要求我输入,只是永远运行而没有做任何事情。调试器在到达第二行后也保持在“应用程序仍在运行”状态。以前从未有过这种行为。
  • 分而治之的方法仍然适用:删除/替换 IDE、工具和 JDK,直到它开始工作,然后检查工具链中最后更改的部分。
  • 好的,谢谢。我终于弄明白了。我在“构建,执行,... > 构建工具 > Gradle”处的 IntelliJ 设置中有错误。我需要将“使用 Gradle 从”更改为“gradle-wrapper.properties”文件。我需要更早地更改它,因为如果使用此设置,jacoco 无法识别任何测试。 ||但是在我的新裸项目中,它仍然不适用于此修复程序。在那里我需要更改“使用构建和运行”(IntelliJ)设置(而不是 Gradle [默认选项])。
【解决方案2】:

现在我在 IntelliJ 中测试了您的代码。当第一个命令没有值按回车键时,它会打印“未指定命令!”对于其他命令,它会根据您的切换案例打印预期的答案。 (作为第一个命令,也在第一个命令之后) 我的意思是它对我有用。请详细说明您的情况出了什么问题。

【讨论】:

  • 好的,谢谢。我不知道错误在哪里。但它肯定不是代码。这是我目前唯一知道的。它不适用于我的几个设备。所以我一开始以为是代码问题。但现在我认为这是一些奇怪的配置问题。
  • 是的,可能是。
猜你喜欢
  • 2012-09-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-11-06
  • 1970-01-01
  • 2023-03-13
  • 2012-01-02
  • 1970-01-01
相关资源
最近更新 更多