System.console()返回null
我正在使用BufferedReader
readLine
从用户获取input/新密码,但要屏蔽密码,所以我想使用java.io.Console
类。 问题是,当在Eclipse中debugging应用程序时, System.console()
返回null
。 我是新来的Java和Eclipse不知道这是最好的方式来实现? 我右键单击源文件并select“debugging为”>“Java应用程序”。 有没有解决办法?
这是eclipse的错误#122429
这个代码片段应该做的伎俩:
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中进行testing时,您的密码input将会清晰显示。 至less,你将能够testing。 testing时不要input真实的密码。 保持生产使用;)。
如果没有控制台, System.console()
将返回null。
您可以通过在代码中添加一个间接层或通过在外部控制台中运行代码并附加一个远程debugging器来解决这个问题 。
在尝试编写简单的命令行应用程序时,我也遇到了这个问题。
另一种从System.in创build自己的BufferedReader对象的方法是使用java.util.Scanner,像这样:
import java.util.Scanner; Scanner in; in = new Scanner(System.in); String s = in.nextLine();
当然,这不会是控制台的直接replace,但会让您访问各种不同的inputfunction。
以下是有关Oracle扫描器的更多文档 。
根据文件 :
如果虚拟机自动启动,例如通过后台作业调度程序,则通常不会有控制台。
根据API :
“如果虚拟机从交互式命令行启动,而不redirect标准input和输出stream,则其控制台将存在,并且通常会连接到启动虚拟机的键盘和显示器。如果虚拟机已启动自动,例如通过后台作业调度程序,那么它通常不会有控制台。“
我相信在Eclipse的运行configuration中,可以configuration是否分配控制台 – 确保检查。 (自从我使用Eclipse以来,已经有一段时间了,所以我不能提供具体的指令)。
如果这不起作用,那么一定会做这个工作的是以debugging模式启动你的应用程序,然后用Eclipse连接到这个进程。 search“eclipse远程debugging”,如果你不知道如何做到这一点。
此外,一般来说, 要求分配一个控制台是一个坏主意,因为这会非常影响应用程序的灵活性 – 就像您刚发现的一样。 调用Java的许多方法将不会分配控制台,并且您的应用程序在这些实例中不可用(这是不好的)。 也许你可以允许在命令行中指定参数。 (如果你正在testing控制台的input,那么就足够公平了,但是对于那些能够从脚本和/或无头的服务器调用你的应用程序的人来说可能是有用的,所以这种灵活的devise几乎总是一个好主意它通常也导致组织更好的代码。)
那是对的。
您将不得不在Eclipse之外运行应用程序。 查看Eclipse内的启动器configuration面板,看看是否可以find在单独的JVM中运行命令的选项。
在程序参数中添加-console以启动OSGi控制台