Java跨文件调用自定义类编译报cannot find symbol错误排查
问题原因
报错由Java包机制的路径匹配规则和编译时工作目录错误导致:
- 两个Java文件头部均声明
package filetest;,说明两个类归属filetest包。Java要求包声明必须和物理目录结构严格对应,且编译、运行类的操作必须在**包的根目录(即filetest文件夹的上一级目录)**执行。 - 你当前直接进入
filetest目录内执行编译命令,编译器默认类路径为当前filetest目录,编译main.java时会按包名查找filetest/ReadSelectWord.class,也就是实际查找路径为filetest/filetest/ReadSelectWord.class,路径完全不匹配,自然无法找到对应类,抛出cannot find symbol错误。 - 你之前在
filetest目录下单独编译ReadSelectWord.java生成的class文件,因为存放路径和包声明不匹配,编译器不会将其识别为同包下的有效类。
修复步骤
- 终端执行
cd ..退回filetest文件夹的上一级目录,确认在该目录下可以直接看到filetest子文件夹,两个Java文件均存放在该子文件夹内。 - 执行编译命令,直接编译包下所有Java文件即可,无需逐个单独编译:
javac filetest/*.java
编译完成后filetest目录下会生成ReadSelectWord.class和main.class两个文件,存放路径和包声明完全匹配。
- 运行时同样保持在包根目录,使用类的全限定名启动程序:
java filetest.main
即可正常完成编译运行。
补充说明
Java编码规范要求类名使用大驼峰格式,建议将main.java的类名修改为Main,文件名同步改为Main.java,避免和入口方法名main产生混淆,该命名规范问题不是本次编译报错的诱因。
内容的提问来源于stack exchange,提问作者Omaro_IB
相关产品推荐
相关产品推荐

