问题描述
在学习《Java核心技术》一书过程中,碰到了使用控制台Console读取密码的问题。但是在IDEA中编程运行的时候,却返回的是空值问题。代码如下:
因为输入是可见的, 所以 Scanner 类不适用于从控制台读取密码。Java SE 6 特别
引入了 Console 类实现这个目的。要想读取一个密码, 可以采用下列代码。
为了安全起见, 返回的密码存放在一维字符数组中, 而不是字符串中。在对密码进
行处理之后,应该马上用一个填充值覆盖数组元素。
package Chapter1;
import java.io.Console;
import java.util.Scanner;
/**
* @author LWH
* @create 2022-08-10 19:24
*/
public class Test1 {
public static void main(String[] args) {
Console cons = System.console();
String username = cons.readLine("plz print username :");
char[] psw = cons.readPassword("plz print password :");
System.out.println("username is :"+username);
System.out.print("password is : ");
System.out.println(psw);
}
}
原因分析:
使用Eclipse等IDE运行以上代码时Console中将会为null。表示Java程序无法获得Console实例,是因为JVM不是在命令行中被调用的,或者输入输出被重定向了。在Eclipse诸如类似的IDE工具中运行Console类。如果没有对Console实例判空操作,结果使用了该实例会抛出java.lang.NullPointerException异常。从控制台中读取密码必须从真正的命令行中读取,官方文档如下所示:
解决方案:
使用cmd编译运行java程序
D:\Learn\javacore\src\Chapter1>javac -encoding UTF-8 Test1.java
//-encoding UTF-8为了防止中文乱码
D:\Learn\javacore\src\Chapter1>java Test1
错误: 找不到或无法加载主类 Test1
原因: java.lang.NoClassDefFoundError: Chapter1/Test1 (wrong name: Test1)
运行时 又显示找不到或无法加载主类,经查阅原因是运行时没有写全类的全名,一个类的全名应该是包名+类名
使用java命令运行class文件提示“错误:找不到或无法加载主类“的问题分析
一、java执行class文件是根据CLASSPATH指定的地方来找,不是我们理解当前目录。如果希望它查询当前目录,需要在CLASSPATH中加入“.;”,代表当前目录。
二、java执行class文件对package的路径是强依赖的。它在执行的时候会严格以当前用户路径为基础,按照package指定的包路径转化为文件路径去搜索class文件。各位同学以后注意就OK啦。至于网上说的要在CLASSPATH要加各种包等等都是泛泛而谈,真正静下心分析这个问题的资料不多。很多都没有说到点子上,会误导人的。
java.lang.NoClassDefFoundError的原因
//仔细看上面的图,我们在main目录下让java命令去执行java Chapter1.Test1,其实它会以为类的路径是:
//D:\Learn\javacore\src\Chapter1\Chapter1.Test1,路径重复了。
所以,我们应该这样执行:
D:\Learn\javacore\src>java Chapter1.Test1
plz print username :111
plz print password :
username is :111
password is : 1111
程序成功运行