Java使用cons.readPassword实现密码掩码在GitBash运行报空指针异常如何解决
Java调用System.console()在Git Bash中空指针异常的解决方案
根本原因
System.console() 方法仅在JVM与原生交互终端绑定的场景下才会返回非空实例:
- Windows CMD是系统原生控制台,JVM可正常识别到绑定的控制台,因此返回非空值,程序运行正常
- Git Bash for Windows默认使用伪终端兼容模式,没有给Windows原生的JVM程序暴露标准交互终端接口,因此
System.console()返回null,直接调用cons.readPassword()就会触发空指针异常 - IDE运行时抛出空指针也是同理,IDE内置的输出控制台是模拟实现,并非原生交互终端
可行解决方案
- 方案1:Git Bash运行时添加
winpty前缀适配,Git Bash自带该工具,无需额外安装,运行命令示例:winpty java -jar yourApp.jar
该方案无需修改代码,即可让JVM识别到终端实例,密码掩码功能正常生效 - 方案2:代码层面做兼容性降级处理,提前判断Console实例是否为空,空的情况下降级为普通输入读取,代码示例:
Console cons = System.console(); char[] PASSWORD; if (cons != null) { PASSWORD = cons.readPassword("ENTER YOUR PASSWORD :"); } else { // 降级逻辑无密码掩码,适合调试场景使用 System.out.print("ENTER YOUR PASSWORD (NO MASK):"); PASSWORD = new Scanner(System.in).nextLine().toCharArray(); } - 方案3:如果需要全终端兼容密码掩码功能,可替换原生Console为JLine等成熟的第三方终端交互库,兼容性远高于原生实现。
内容的提问来源于stack exchange,提问作者Davertonator
相关产品推荐
相关产品推荐

