System.console()返回null

时间:2010-11-17 10:55:32

标签: java eclipse console springsource

我使用readLine BufferedReader来获取用户的输入/新密码,但是想掩盖密码,所以我尝试使用java.io.Console类。问题是当在Eclipse中调试应用程序时System.console()返回null。我是Java和Eclipse的新手,不确定这是最好的实现方式吗?我右键单击源文件并选择“Debug As”> “Java应用程序”。有没有解决方法?

13 个答案:

答案 0 :(得分:35)

这是日食的bug #122429

答案 1 :(得分:32)

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

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中进行测试时,您的密码输入将以明文形式显示。至少,你将能够测试。只是在测试时不要输入真实密码。保留它用于生产用途;)。

答案 2 :(得分:13)

如果没有控制台,

System.console()将返回null。

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

答案 3 :(得分:8)

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

从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

答案 4 :(得分:6)

根据docs

  

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

答案 5 :(得分:6)

根据 API

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

答案 6 :(得分:2)

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

  

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

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

答案 7 :(得分:1)

我相信在Eclipse的运行配置中,您可以配置是否分配控制台 - 确保选中此选项。 (自从我使用Eclipse以来已经有一段时间了,所以我不能给出具体的指示。)

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

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

答案 8 :(得分:0)

这是对的。

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

答案 9 :(得分:0)

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

**

答案 10 :(得分:0)

如果您的IDE使用javaw而不是java,则此问题肯定会发生,因为javaw本质上是没有控制台窗口的Java。

答案 11 :(得分:-1)

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

答案 12 :(得分:-1)

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