【问题标题】:System.console() returns nullSystem.console() 返回 null
【发布时间】:2011-05-11 08:36:42
【问题描述】:

我使用BufferedReaderreadLine 从用户那里获取输入/新密码,但想屏蔽密码,所以我尝试使用java.io.Console 类。问题是当在 Eclipse 中调试应用程序时,System.console() 返回null。我是 Java 和 Eclipse 的新手,不确定这是实现的最佳方式吗?我右键单击源文件并选择“调试为”>“Java 应用程序”。有什么解决办法吗?

【问题讨论】:

标签: java eclipse console springsource


【解决方案1】:

这是一个bug #122429的eclipse

【讨论】:

    【解决方案2】:

    这段代码 sn-p 应该可以解决问题:

    private String readLine(String format, Object... args) throws IOException {
        if (System.console() != null) {
            return System.console().readLine(format, args);
        }
        System.out.print(String.format(format, args));
        BufferedReader reader = new BufferedReader(new InputStreamReader(
                System.in));
        return reader.readLine();
    }
    
    private char[] readPassword(String format, Object... args)
            throws IOException {
        if (System.console() != null)
            return System.console().readPassword(format, args);
        return this.readLine(format, args).toCharArray();
    }
    

    在 Eclipse 中进行测试时,您的密码输入将清晰显示。至少,您将能够进行测试。只是不要在测试时输入您的真实密码。保留它以供生产使用;)。

    【讨论】:

    • 您的手动readLine 方法是否应该在finally(或try-with-resources)块中关闭BufferedReader
    • 否,因为这会关闭匹配 System.in 流并且之后无法进行进一步读取。
    • 是的,这个流可以关闭很奇怪;我希望它是一个空操作。
    【解决方案3】:

    System.console() 如果没有控制台,则返回 null。

    您可以通过adding a layer of indirection to your code 或在外部控制台和attaching a remote debugger 中运行代码来解决此问题。

    【讨论】:

    • 当我在 PowerShell 中运行 java -cp ... Class | tee out 之类的东西时,它也为我返回了 null。
    【解决方案4】:

    我在尝试编写一个简单的命令行应用程序时也遇到了这个问题。

    从 System.in 创建自己的 BufferedReader 对象的另一种方法是像这样使用 java.util.Scanner:

    import java.util.Scanner;
    
    Scanner in;
    in = new Scanner(System.in);
    
    String s = in.nextLine();
    

    当然,这不会是 Console 的直接替代品,但可以让您访问各种不同的输入功能。

    这里是more documentation on Scanner from Oracle

    【讨论】:

      【解决方案5】:

      根据API

      “如果虚拟机从交互式命令行启动而不重定向标准输入和输出流,那么它的控制台将存在,并且通常会连接到启动虚拟机的键盘和显示器。如果虚拟机是自动启动的,例如通过后台作业调度程序,那么它通常不会有控制台。”

      【讨论】:

        【解决方案6】:

        根据docs

        如果虚拟机是自动启动的,例如通过后台作业调度程序,那么它通常不会有控制台。

        【讨论】:

        • 这个答案让我发现,如果您在启用守护程序的情况下运行 Gradle,您将无法在 Gradle 任务中获得控制台。使用“--no-daemon”运行我的 Gradle 任务允许控制台访问。
        • 我在使用 Drip (github.com/ninjudd/drip) 作为命令行工具时发生了这种情况。糟糕!
        【解决方案7】:

        从 Netbeans 运行应用程序时收到此错误消息。从其他答案来看,从 IDE 运行应用程序时似乎会发生这种情况。 如果你看看这个问题:Trying to read from the console in Java,那是因为

        大多数 IDE 使用 javaw.exe 而不是 java.exe 来运行 Java 代码

        解决方法是使用command line/terminal获取Console

        【讨论】:

          【解决方案8】:

          我参考并使用了上面显示的formixian的答案。重点是使用(黑色)cmd 控制台按照“ojonugwa ochalifu”的建议运行您的 Java 程序。

          【讨论】:

            【解决方案9】:

            没错。

            您必须在 Eclipse 之外运行该应用程序。查看 Eclipse 中的启动器配置面板,看看您是否可以发现在单独的 JVM 中运行命令的选项。

            【讨论】:

              【解决方案10】:

              我相信在 Eclipse 的运行配置中,您可以配置是否分配控制台 - 确保选中此项。 (我用 Eclipse 已经有一段时间了,所以恐怕无法给出具体的说明)。

              如果这不起作用,那么肯定会完成这项工作的方法是以调试模式启动您的应用程序,然后使用 Eclipse 连接到该进程。如果您不确定如何执行此操作,请搜索“eclipse 远程调试”。

              此外,通常要求分配一个控制台是个坏主意,因为这会极大地影响您的应用程序的灵活性 - 正如您刚刚发现的那样。许多调用 Java 的方法都不会分配控制台,并且您的应用程序在这些情况下无法使用(这很糟糕)。也许您也可以允许在命令行上指定参数。 (如果您正在专门测试控制台输入,那么就足够公平了,但是人们能够从脚本和/或无头服务器上调用您的应用程序可能很有用,因此这种灵活的设计几乎总是一个好主意. 它通常也会导致更好的组织代码。)

              【讨论】:

              • 是的,它仅用于我的调试目的,用户将获得 shell 脚本或 bat 文件。使用控制台不是很好吗?如果是的话有什么更好的方法
              • 顺便说一句,所有远程调试搜索都在谈论 abt web 服务器,但我没有创建 web 应用程序。这是一个普通的java。可能是更好的隐藏密码的方法?
              • 您可以远程调试任何 Java 进程,只需添加例如-Xdebug -Xrunjdwp:transport=dt_socket,server=y,suspend=n,address=8000 到 VM 的参数(至少在 Sun JVM 上)。使用控制台可能没问题,但正如所指出的,这意味着您的代码在没有控制台的情况下将无法工作。相反,考虑传入直接来自命令行参数、系统属性、属性文件等的值。至少提供一些替代方案 - 例如仅当值没有作为命令行参数提供时才转到控制台。
              【解决方案11】:

              如果你的IDE使用javaw而不是java,那么这个问题肯定会发生,因为javaw本质上是没有控制台窗口的java。

              【讨论】:

                【解决方案12】:

                尝试编译你的类并在终端中运行它。它有效。

                【讨论】:

                  【解决方案13】:

                  在您的程序参数中添加 -console 以启动 OSGi 控制台

                  【讨论】:

                  • 如果可能的话,您能否举例说明一下?
                  • 我今天学到了一些新东西,谢谢。但是,eclipse 仍然从内部控制台中读取参数。所以你提出的解决方案不会解决原来的问题。
                  猜你喜欢
                  • 1970-01-01
                  • 1970-01-01
                  • 2014-12-05
                  • 2023-03-31
                  • 1970-01-01
                  • 1970-01-01
                  • 1970-01-01
                  相关资源
                  最近更新 更多