java核心技术 卷I 书籍中有关 java.io.Console 类的1个示例 System.console().readLine() 与 System.console().readPassword() 在 idea 中运行出现 java.lang.NullPointerException
原因分析。
代码如下:
// InputTest.java
Console cons = System.console();
// System.out.println(cons == null ? "null console." : cons);
String username = cons.readLine("User name: "); // 1.
char[] passwd = cons.readPassword("Password:"); //2.
System.out.println("your user name is:"+username+". your password is:"+ new String(passwd));
在 Idea 编译运行出现 java.lang.NullPointerException
错误. 经测试,原因是 cons 为 null.
至于 System.console()
为何返回 null,经查阅资料得知:
java.io.Console 是java 6 引入专用来访问基于字符的控制台设备。
Java 要与Console进行交互,不总是能得到可用的Java Console类的。一个JVM是否有可用的Console,依赖于底层平台和JVM如何被调用。如果JVM是在交互式命令行(比如Windows的 cmd,linux/unix的 terminal)中启动的,并且输入输出没有重定向到另外的地方,才可得到一个可用的Console实例。
当在Eclipse或NetBean中运行以上代码 System.console()
时Console中将会有以下文字输出:
Console is unavailable.
表示Java程序无法获得Console实例,是因为JVM不是在命令行中被调用的,或者输入输出被重定向了。
而在 Idea 中运行不会提醒Console实例是否可用。
但在 IDE中 当使用 System.console()
返回的实例调用方法时,会抛出 java.lang.NullPointerException
.
因而建议:
Console cons = System.console()
返回的实例调用方法前,应对实例 cons
进行是否为 null 的判断,再执行其他流程。最后再提醒一次
Java.io.Console 只能用在标准输入、输出流未被重定向的原始控制台中使用,在 Eclipse / Idea 或者其他 IDE 的控制台是不可用的。