java - 为什么 System.console() 对于命令行应用程序返回 null?

标签 java console console-application system-calls

我正在开发一个依赖于用户命令行输入的遗留应用程序:

String key = System.console().readLine("Please enter the license key: ");

但是,我得到了 NullPointerException因为System.console()给我一个空值。

为什么System.console()命令行应用程序返回 null?从终端和 IDE 运行它时会发生这种情况。

最佳答案

如果您从终端窗口启动 java,那么它确实应该可以工作,即使我还没有在 OSX 上尝试过。

如果直接从终端使用 java 运行一个简单的测试,它可以工作吗?

echo 'public class Test { public static void main(String[] args) {System.console().printf("hello world%n");}}' >Test.java && javac Test.java && java Test 

预期输出:

hello world

如果不起作用,那么抱歉,您的平台不支持控制台。

但是,如果它可以工作,而您的程序却不能,那么您的程序启动方式就有问题。

检查java二进制文件是如何启动的?它是从 shell 脚本启动的吗?检查 stdin/stdout 是否未重定向或通过管道传输到某些内容,并且可能还没有在后台启动。

例如:这可能会使 System.console() 返回 null。

java Test | tee >app.log    

还有这个:

java Test >/tmp/test.log

这似乎适用于我的机器(linux)

java Test &

即使在几次之后,System.setOutSystem.setErrSystem.setIn 似乎也不会影响控制台。 gc 和终结器。

<小时/>

但是:

关闭(原始)System.outSystem.in 也会禁用控制台

echo 'public class Test { public static void main(String[] args) {System.out.close();System.console().printf("hello world%n");}}' >Test.java && javac Test.java && java Test 

预期输出:

Exception in thread "main" java.lang.NullPointerException
at Test.main(Test.java:1)

所以;扫描代码以查找关闭流的位置,或将 System.out 传递到可能关闭的位置。

关于java - 为什么 System.console() 对于命令行应用程序返回 null?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20982664/

相关文章:

java - 深入了解Collections的removeAll方法

java - 使用 Pentaho PDI (Kettle) 将报告上传到 BA 服务器

java - H2 数据存储 : how to execute console from Java app?

javascript - 当我查看 DOM 对象的 getter 属性时,控制台中发生了什么?

java - 在 JButton 上绘制图形

java - 使用 Java 进行 SSH 私钥验证

c++ - 让用户在字符串中间键入(c/c++)?

c# - 在 C# 控制台应用程序中更改线程上下文

c++ - 如何让 mciSendString 同时处理变量和空格?

c++ - 计算和数据限制