Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/362.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java System.console()返回null_Java_Eclipse_Console_Springsource - Fatal编程技术网

Java System.console()返回null

Java System.console()返回null,java,eclipse,console,springsource,Java,Eclipse,Console,Springsource,我使用BufferedReader的readLine从用户那里获取输入/新密码,但想屏蔽密码,所以我尝试使用java.io.Console类。问题是当在Eclipse中调试应用程序时,System.console()返回null。我是Java和Eclipse新手,不确定这是实现的最佳方式吗?我右键单击源文件并选择“调试为”>“Java应用程序”。有什么解决办法吗?没错 您必须在Eclipse之外运行应用程序。查看Eclipse中的launcher配置面板,看看是否可以找到在单独的JVM中运行命令

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

没错


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

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

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

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

根据:

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

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


您可以通过或在外部控制台中运行代码来解决此问题,并在您的程序参数中添加-console以启动OSGi控制台这是eclipse的一个示例这段代码应该可以实现以下功能:

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中进行测试时,您的密码输入将以明文显示。至少,你可以进行测试。测试时不要输入真实密码。将其保留以供生产使用;)

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

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

import java.util.Scanner;

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

String s = in.nextLine();
当然,这并不是控制台的替代品,而是让您能够访问各种不同的输入功能


以下是根据API


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

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

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


解决方案是使用
命令行/终端
获取
控制台

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


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

是的,这只是为了我的调试目的,用户会得到shell脚本或bat文件。使用控制台不是很好吗?如果是的,那么更好的方法是什么呢屏蔽web应用程序。这是一个普通的java。可能是屏蔽密码的更好方法?您可以远程调试任何java进程,只需将例如
-Xdebug-Xrunjdwp:transport=dt_socket,server=y,suspend=n,address=8000
添加到VM的参数中(至少在Sun JVM上)使用控制台可以是好的,但是指出的是,当没有一个代码启动时,你的代码就不能工作了。相反,考虑直接从命令行参数、系统属性、属性文件等中传递值,提供一些替代方案。例如,如果没有提供一个值作为COM,则只能进入控制台。和行参数。如果可能的话,你能澄清一下吗?我今天学到了一些新东西,谢谢。但是,eclipse仍然从内部控制台读取参数。因此,你提出的解决方案无法解决最初的问题。当运行类似
java-cp.的东西时,它在PowerShell中也为我返回null。。.Class | tee out
。这个答案让我发现,如果您在启用deamon的情况下运行Gradle,您将无法在Gradle任务中获得控制台。使用“--no daemon”运行我的Gradle任务可以访问控制台。我在使用drip()时遇到了这种情况对于命令行工具.Oops!还请参见我识别的
System.out
System.in
足以满足我的用例,并支持使用
System.console()
。您是否应该在finally中手动滚动
readLine
方法关闭
BufferedReader
阻塞?否,因为这将关闭匹配的
系统。在
流中,在