Java同包类对象创建时cmd编译出现cannot find symbol错误求助
解决同包类在CMD编译时找不到的问题
问题代码
主类Revenue.java:
package Hotel; //import java.util.*; public class Revenue { String Name; Revenue() { Name=""; } public void Guest() { System.out.println("Revenue Guest. "); Persons x = new Persons(); //错误发生在这里 System.out.println("Guest name:" + x.name() ); } public static void main(String args[]) { System.out.println("Revenue main."); Revenue rev = new Revenue(); rev.Guest(); } }
次级类Persons.java:
package Hotel; public class Persons { String firstName[] = {"Adam","Alex", "Steve", "Sira"}; public Persons() { } public String name() { System.out.println("Persons name"); java.util.Random r = new java.util.Random(); String name = firstName[r.nextInt(firstName.length)]; return name; } public static void main(String[] args) { Persons n = new Persons(); System.out.println(n.name()); } }//class
错误信息
Revenue.java:18: error: cannot find symbol Persons x = new Persons(); ^ symbol: class Persons location: class Revenue Revenue.java:18: error: cannot find symbol Persons x = new Persons(); ^ symbol: class Persons location: class Revenue 2 errors error: compilation failed
问题原因
你给类加了package Hotel;声明,Java的包机制要求类文件必须放在与包名同名的子目录下,且编译、运行时要基于包的父目录操作。VS Code和BlueJ会自动帮你处理目录结构和类路径,而CMD需要手动执行正确的命令。
解决步骤
调整目录结构
创建一个名为Hotel的子目录,把Revenue.java和Persons.java都移进去。最终目录结构如下:你的工作目录/ Hotel/ Revenue.java Persons.java编译代码
打开CMD,切换到Hotel目录的父目录(也就是你的工作目录),执行编译命令:javac Hotel/*.java这个命令会同时编译
Hotel目录下的两个.java文件,编译后的.class文件会自动生成在Hotel目录里。运行程序
同样在父目录下,执行运行命令:java Hotel.Revenue这里必须用
包名.类名的格式来指定要运行的主类。
额外说明
如果不想用包声明,也可以直接删掉两个类里的package Hotel;语句,然后在两个.java文件所在目录直接执行:
javac Revenue.java Persons.java java Revenue
这样也能正常运行,但如果后续要扩展多包结构,还是建议保留包声明并遵循目录规范。
内容的提问来源于stack exchange,提问作者user9812664
相关产品推荐
相关产品推荐

