我正在开发一个依赖于用户命令行输入的遗留应用程序:
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.setOut
、System.setErr
或 System.setIn
似乎也不会影响控制台。 gc 和终结器。
但是:
关闭(原始)System.out
或 System.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/