【问题标题】:"Cannot find symbol" for my own class我自己的班级“找不到符号”
【发布时间】:2011-08-25 06:41:18
【问题描述】:

我没有设置 %CLASSPATH%。据我了解,这应该不是问题,因为 Javac 将假定当前目录的类路径。

正如您在下面看到的,javac 无法找到我的 Case 类,即使它位于同一个目录中。关于为什么会发生这种情况的任何想法?当我使用 Eclipse 时,这段代码可以正常工作。

C:\Documents and Settings\joep\My Documents\GCJ\src\codejam2011\Round0\D>dir /B
Case.class
Case.java
EntryPoint.java

C:\Documents and Settings\joep\My Documents\GCJ\src\codejam2011\Round0\D>javac EntryPoint.java

EntryPoint.java:16: cannot find symbol
symbol  : class Case
location: class codejam2011.Round0.D.EntryPoint
                ArrayList<Case> cases = new ArrayList<Case>();
                          ^
EntryPoint.java:16: cannot find symbol
symbol  : class Case
location: class codejam2011.Round0.D.EntryPoint
                ArrayList<Case> cases = new ArrayList<Case>();
                                                      ^
EntryPoint.java:24: cannot find symbol
symbol  : class Case
location: class codejam2011.Round0.D.EntryPoint
                                cases.add(new Case(new Integer(count), line));
                                              ^
3 errors

C:\Documents and Settings\joep\My Documents\GCJ\src\codejam2011\Round0\D>

更新 1:

尝试从我的包根目录 (src) 编译后,我收到一个新错误(即使在删除 Case.class 文件之后)

C:\Documents and Settings\joep\My Documents\GCJ\src>javac -cp . codejam2011/Round0/D/EntryPoint.java

codejam2011\Round0\D\EntryPoint.java:16: cannot access codejam2011.Round0.D.Case

bad class file: .\codejam2011\Round0\D\Case.java
file does not contain class codejam2011.Round0.D.Case
Please remove or make sure it appears in the correct subdirectory of the classpath.
                ArrayList<Case> cases = new ArrayList<Case>();
                          ^
1 error

C:\Documents and Settings\joep\My Documents\GCJ\src>

更新 2: 它似乎是从另一个包中获取 Case.java 文件。

C:\Documents and Settings\joep\My Documents\GCJ\src>javac -d ../classes codejam2011\Round0\D\*.java

.\codejam2011\Round0\D\Case.java:4: duplicate class: codejam2011.Round0.C.Case
public class Case
       ^
codejam2011\Round0\D\EntryPoint.java:16: cannot access codejam2011.Round0.D.Case

bad class file: .\codejam2011\Round0\D\Case.java
file does not contain class codejam2011.Round0.D.Case
Please remove or make sure it appears in the correct subdirectory of the classpath.
                ArrayList<Case> cases = new ArrayList<Case>();
                          ^
2 errors

C:\Documents and Settings\joep\My Documents\GCJ\src>

【问题讨论】:

  • 您是否在 EntryPoint 中导入了类 Case?
  • @Danish:没必要,因为它在同一个包中。
  • 你研究过错误信息吗? duplicate class: codejam2011.Round0.C.Case 有 C 和 D - 模棱两可。您必须排除一些导入,或者明确指定您的意思是哪个 Case、codejam2011.Round0.C.Case 或 codejam2011.Round0.D.Case。
  • @user 虽然它们在不同的包中。为什么编译器会感到困惑并尝试使用不同包中的一个?
  • 我没有您的源目录、目标目录、当前目录、环境变量和您的操作历史的概述。您应该开始删除所有旧课程。

标签: java compiler-errors packages javac


【解决方案1】:

您需要从包根目录编译,而不是从包内部编译。

所以,cdsrc 文件夹并从那里编译。

javac -cp . codejam2011/Round0/D/EntryPoint.java

更新:根据你的新问题,你需要用同样的方法重新编译Case.java。它显然是以相同的错误方式编译的(从包内部)。

【讨论】:

  • 当我将类路径设置为. 并且我正在使用包时,我得到了同样的错误——也许这就是它不起作用的原因?我的包是codejam2011.Round0.D
  • 我更新了答案。没想到你是从包里面编译的,不是这样的。
【解决方案2】:

您位于错误的编译目录。

location: class codejam2011.Round0.D.EntryPoint

这告诉我,您的包是 codejam2011.Round0.D(这违反了约定(全部小写),但题外话......

cd 到 codejam2011 的父目录,也就是 src,不是吗?

javac codejam2011\Round0\D\EntryPoint.java

可能会成功。

通常你有一个编译类的目录,比如“bin”或“classes”。要在那里生成类,请使用 -d(目标):

javac -d ../classes codejam2011\Round0\D\EntryPoint.java

【讨论】:

  • 感谢关于小写包约定的提示。我会解决的。至于编译,还是没有运气
  • 新的错误是什么? Case属于什么包?是否在同一个包中(简单)?没有包(:=匿名,不可能)。您是否对 Case 有特殊的导入 - 我不这么认为。试试javac -d ../classes codejam2011\Round0\D\*.java
  • Case 和 EntryPoint 在同一个包中。 (codejam2011.Round0.D)
  • 你执行javac -d ../classes codejam2011\Round0\D\*.java了吗?错误信息?
【解决方案3】:

如果从包根目录编译还没有解决问题(见其他答案):

  • 确保所有源文件都包含名称与其文件名对应的类
  • 确保所有源文件都包含与其在源文件层次结构中的位置相对应的包语句
  • 在编译之前删除所有 .class 文件(如果您检查了其他所有内容,这应该只需要一次)。

因此,如果文件是codejam2011\Round0\D\Case.java,它应该包含package codejam2011.Round0.D; 作为第一个声明,然后是public class Case { ... }。另外,请确保没有包含此包和类声明的其他源文件。

从您的错误消息来看,package 语句似乎是 package codejam2011.Round0.C;(并且您在真正的 codejam2011.Round0.C 包中还有一个类 Case)。

【讨论】:

  • 非常感谢您的回答并一一解释!终于解决了这个问题!
【解决方案4】:

我有类似的问题,它可能不适用于所有情况,但我所做的是删除 .gradle,构建并输出文件夹并再次重建程序。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-06-18
    • 1970-01-01
    • 1970-01-01
    • 2013-05-26
    • 1970-01-01
    相关资源
    最近更新 更多