为我自己的班级“找不到符号”

时间:2011-05-13 21:38:16

标签: java compiler-errors packages javac

我没有设置%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>

4 个答案:

答案 0 :(得分:19)

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

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

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

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

答案 1 :(得分:1)

如果问题尚未通过从程序包根目录编译来解决(请参阅其他答案):

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

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

在您的错误消息中,看起来包语句为package codejam2011.Round0.C;(并且您在真实Case包中也有一个类codejam2011.Round0.C)。

答案 2 :(得分:0)

您在错误的目录中进行编译。

location: class codejam2011.Round0.D.EntryPoint

那告诉我,你的软件包是codejam2011.Round0.D(违反惯例(全部小写),但除此之外......

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

javac codejam2011\Round0\D\EntryPoint.java

可能会成功。

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

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

答案 3 :(得分:-1)

我有类似的问题,它可能不适用于所有情况,但我所做的是删除.gradle,build和out文件夹并重新生成程序。