System.console().readPassword() java.lang.NullPointerException

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.

在 win10 cmd 中编译运行正常:
System.console().readPassword() java.lang.NullPointerException_第1张图片

因而建议:

  1. 在使用 Console cons = System.console() 返回的实例调用方法前,应对实例 cons 进行是否为 null 的判断,再执行其他流程。
  2. 如果你的Java程序要与Windows下的cmd或者Linux / unix 下的Terminal交互,就可以用这个Java Console类代劳。因这类交互式命令行中启动应用程序使其返回可用的 Console 实例。

最后再提醒一次

Java.io.Console 只能用在标准输入、输出流未被重定向的原始控制台中使用,在 Eclipse / Idea 或者其他 IDE 的控制台是不可用的。

(本文结束)

你可能感兴趣的:(java,Console,空指针,System.console,Console读取密码,java控制台读取密码,cons.readPasswd)