85

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

4

13 回答 13

37

这是 Eclipse 的错误#122429

于 2011-12-14T13:11:05.340 回答
34

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

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

于 2012-06-26T00:38:41.980 回答
16

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

您可以通过向代码添加一个间接层或通过在外部控制台中运行代码并附加远程调试器来解决此问题。

于 2010-11-17T11:13:47.663 回答
9

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

从 System.in 创建自己的 BufferedReader 对象的另一种方法是使用 java.util.Scanner,如下所示:

import java.util.Scanner;

Scanner in;
in = new Scanner(System.in);

String s = in.nextLine();

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

这是Oracle 提供的有关 Scanner 的更多文档

于 2014-09-23T15:28:14.787 回答
8

根据API

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

于 2016-08-22T06:43:18.003 回答
7

根据文档

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

于 2010-11-17T11:01:54.593 回答
6

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

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

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

于 2018-06-25T20:19:19.203 回答
2

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

**

于 2019-12-01T14:50:49.400 回答
1

没错。

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

于 2010-11-17T11:00:14.587 回答
1

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

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

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

于 2010-11-17T11:00:55.290 回答
1

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

于 2020-05-24T13:19:37.260 回答
0

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

于 2021-07-18T13:33:51.200 回答
-1

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

于 2010-11-17T13:55:13.937 回答