我正在使用readLineBufferedReader从用户获取输入/新密码,但想屏蔽该密码,因此我尝试使用java.io.Console类。问题是,在Eclipse中调试应用程序时,System.console()返回null。我是Java和Eclipse的新手,不确定这是否是最好的方法吗?我右键单击源文件,然后选择“调试为”>“ Java应用程序”。有什么解决方法吗?

评论

另请参见stackoverflow.com/questions/26470972/…我确定System.out和System.in足以满足我的用例,并使用System.console()进行了废弃。

#1 楼

这是eclipse的错误#122429

#2 楼

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

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?

–安德鲁·斯旺(Andrew Swan)
17年8月28日在5:48

不可以,因为那样会关闭匹配的System.in流,并且此后无法再进行任何读取。

–formixian
17年8月28日在21:00

是的,可以关闭此流很奇怪;我希望这不会发生。

–安德鲁·斯旺(Andrew Swan)
17年8月29日在0:40

#3 楼

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

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

评论


当运行类似java -cp ...的东西时,它在PowerShell中也为我返回了null。开球。

–lmat-恢复莫妮卡
13年4月12日在19:21

#4 楼

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

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

import java.util.Scanner;

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

String s = in.nextLine();


当然这不是控制台的直接替代品,而是使您可以访问各种不同的输入功能。

这里有Oracle的Scanner的更多文档。

#5 楼

根据文档:


如果虚拟机是自动启动的(例如,由后台作业调度程序启动),则该虚拟机通常将没有控制台。


评论


这个答案使我发现,如果在启用了守护程序的情况下运行Gradle,您将无法在Gradle任务中获得控制台。使用'--no-daemon'运行我的Gradle任务可以访问控制台。

–whitespy9
2015年12月4日15:43



当使用drip(github.com/ninjudd/drip)作为命令行工具时,这发生在我身上。糟糕!

–乔治L
16 Dec 20 '21:59

#6 楼

根据API:

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

#7 楼

从Netbeans运行应用程序时收到此错误消息。从其他答案来看,这似乎是从IDE运行应用程序时发生的。
如果您看一下这个问题:尝试从Java控制台中读取,是因为


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


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

#8 楼

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

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

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

评论


是的,它仅用于调试目的,用户将获得shell脚本或bat文件。使用控制台难道不是吗?如果是,还有什么更好的方法

–高卢斯
10 Nov 17 '11:15



顺便说一句,所有远程调试搜索都在讨论Web服务器,但是我没有创建Web应用程序。这是一个普通的java。可能是屏蔽密码的更好方法?

–高卢斯
10 Nov 18'在10:20

您可以远程调试任何Java进程,只需添加例如-Xdebug -Xrunjdwp:transport = dt_socket,server = y,suspend = n,address = 8000到VM的参数(至少在Sun JVM上)。可以使用控制台,但是要指出的是,如果不使用控制台,则代码根本无法正常工作。相反,请考虑传入直接来自命令行参数,系统属性,属性文件等的值。至少至少提供一些替代方法-例如仅当未提供值作为命令行参数时才进入控制台。

–安德烈·道尔(Andrzej Doyle)
2010年11月18日在16:20

#9 楼

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



#10 楼

没错。

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

#11 楼

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

#12 楼

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

评论


如果可能的话,请您进一步说明一下吗?

–高卢斯
2010-11-17 14:34

我今天学到了一些新东西,谢谢。但是,eclipse仍从内部控制台内部读取参数。因此,您提出的解决方案将无法解决原始问题。

–基斯瓦尼
18年8月13日在3:19