【问题标题】:cannot find symbol when compiling java编译java时找不到符号
【发布时间】:2014-05-27 17:34:20
【问题描述】:

我在同一个包demo中有几个类,但最重要的是Server.java和MyServerImpl.java。在 Server.java 我有这个代码

package demo;

public class Server
{public static void main( String[] args ) throws Exception
        {
MyServerImpl s = new MyServerImpl("blablabla");
...
}

还有 MyServerImpl 类

package demo;

public class MyServerImpl extends MyServerPOA {

        private String location;

        public MyServerImpl( String location )
        {
            this.location = location;
        }

        public void add ( String value ){
            System.out.println("name " + value + location );

        }
            }

当我尝试使用 javac 编译时出现此错误

cannot find symbol
symbol  : class MyServerImpl
location: class demo.Server
            MyServerImpl s = new MyServerImpl("blablabla");

我尝试使用此命令进行编译 javac project/demo/Server.java 当我在演示文件夹中时 javac Server.java 但仍然出现同样的错误

【问题讨论】:

  • 先编译MyServerImpl
  • 从文件夹项目编译时会发生什么?
  • 我真的觉得这个错误信息应该重命名。除了知道编译器是什么的软件工程师之外,没有人会理解“符号”是“令牌”。更好的错误消息 = 更少的 SO 问题。
  • 当我在文件夹 demo 和 project 中时,我遇到了完全相同的错误。@Braj 当我尝试编译 MyserverImpl 时,我也遇到了来自同一包中的 MyServerPOA 的相同错误。

标签: java javac


【解决方案1】:

扩展我的评论:

javac 查找类时,它查找的文件夹基于类的完全限定名称。

因此,在您的情况下,MyServerImpl 的完全限定名称是 demo.MyServerImpl。因此,当编译器在Server.java 中遇到MyServerImpl 时,它会查找名为demo 的文件夹,如果找到该文件夹​​,则查找MyServerImpl.java

如果你cd'd 进入演示,这将导致编译失败,因为demo 显然不包含自己(否则你可能有一些损坏的操作系统)。

所以你需要做的是cd 进入文件夹上面 demo。因此,例如,如果您的文件层次结构是 src 作为 root,其中包含 demo 包,其中包含 Server.javaMyServerImpl.java

  1. cdsrc,这样如果你 ls/dirdemo 是显示的文件夹(之一)
  2. javac demo/Server.java
  3. 完成(希望如此)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-06-16
    • 1970-01-01
    • 1970-01-01
    • 2013-09-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多