You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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需要手动执行正确的命令。

解决步骤

  1. 调整目录结构
    创建一个名为Hotel的子目录,把Revenue.java和Persons.java都移进去。最终目录结构如下:

    你的工作目录/
        Hotel/
            Revenue.java
            Persons.java
    
  2. 编译代码
    打开CMD,切换到Hotel目录的父目录(也就是你的工作目录),执行编译命令:

    javac Hotel/*.java
    

    这个命令会同时编译Hotel目录下的两个.java文件,编译后的.class文件会自动生成在Hotel目录里。

  3. 运行程序
    同样在父目录下,执行运行命令:

    java Hotel.Revenue
    

    这里必须用包名.类名的格式来指定要运行的主类。

额外说明

如果不想用包声明,也可以直接删掉两个类里的package Hotel;语句,然后在两个.java文件所在目录直接执行:

javac Revenue.java Persons.java
java Revenue

这样也能正常运行,但如果后续要扩展多包结构,还是建议保留包声明并遵循目录规范。

内容的提问来源于stack exchange,提问作者user9812664

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.19 15:27:33