web-dev-qa-db-ja.com

自分のクラスの「シンボルが見つかりません」

%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>
9
Joe Phillips

パッケージ内からではなく、パッケージルートからコンパイルする必要があります。

したがって、cdsrcフォルダーに移動し、そこからコンパイルします。

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

更新:新しい問題に従って、同じ方法でCase.Javaを再コンパイルする必要があります。それは明らかに同じ間違った方法でコンパイルされました(パッケージ内から)。

20
BalusC

パッケージのルートディレクトリからコンパイルしても問題が解決しない場合(他の回答を参照):

  • すべてのソースファイルに、ファイル名に対応する名前のクラスが含まれていることを確認してください
  • すべてのソースファイルに、ソースファイル階層内の位置に対応するパッケージステートメントが含まれていることを確認してください
  • コンパイルする前にすべての.classファイルを削除します(他のすべてをチェックした場合、これは1回だけ必要です)。

したがって、ファイルがcodejam2011\Round0\D\Case.Javaの場合、最初の宣言としてpackage codejam2011.Round0.D;を含み、次にpublic class Case { ... }を含む必要があります。また、このパッケージとクラス宣言を含む他のソースファイルがないことを確認してください。

エラーメッセージから、パッケージステートメントは代わりにpackage codejam2011.Round0.C;のように見えます(また、実際のcodejam2011.Round0.CパッケージにはクラスCaseがあります)。

1
Paŭlo Ebermann

コンパイルするために間違ったディレクトリにいます。

location: class codejam2011.Round0.D.EntryPoint

これは、パッケージがcodejam2011.Round0.D(これは規則(すべて小文字)に反しますが、要点を超えていることを示しています...

codejam2011の親ディレクトリであるsrcにcdしますね?

javac codejam2011\Round0\D\EntryPoint.Java

トリックをするかもしれません。

多くの場合、「bin」や「classes」などのコンパイル済みクラス用のディレクトリがあります。そこでクラスを作成するには、-d(宛先)を使用します。

javac -d ../classes codejam2011\Round0\D\EntryPoint.Java
0
user unknown