«Не могу найти символ» для своего класса - PullRequest
9 голосов
/ 14 мая 2011

У меня не настроен% 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 ]

19 голосов
/ 14 мая 2011

Вам нужно скомпилировать из корня пакета, а не изнутри пакета.

Итак, cd в папку src и откомпилируйте оттуда.

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

Обновление : согласно вашей новой проблеме, вам необходимо перекомпилировать Case.java таким же образом. По-видимому, он был скомпилирован не так (изнутри пакета).

1 голос
/ 15 мая 2011

Если проблема еще не решена путем компиляции из корневого каталога пакета (см. Другие ответы):

  • убедитесь, что все исходные файлы содержат классы с именами, соответствующими их именам
  • убедитесь, что все исходные файлы содержат оператор пакета, соответствующий их положению в иерархии исходных файлов
  • удалите все ваши файлы .class перед компиляцией (это необходимо сделать только один раз, если вы проверили все остальное).

Таким образом, если файл codejam2011\Round0\D\Case.java, он должен содержать package codejam2011.Round0.D; в качестве первого объявления, а затем public class Case { ... }.Кроме того, убедитесь, что нет другого исходного файла, содержащего этот пакет и объявление класса.

Из вашего сообщения об ошибке похоже, что оператор пакета вместо этого package codejam2011.Round0.C; (и у вас также есть класс Case внастоящий codejam2011.Round0.C пакет).

0 голосов
/ 11 апреля 2018

У меня похожая проблема, она может относиться не ко всем случаям, но я удалил .gradle, собрал и удалил папку и заново перестроил программу.

0 голосов
/ 14 мая 2011

Вы не в том каталоге для компиляции.

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
...