«Не удается найти символ» для моего собственного класса

#java #compiler-errors #packages #javac

#java #ошибки компилятора #пакет #javac

Вопрос:

У меня не настроен %CLASSPATH%. Насколько я понимаю, это не должно быть проблемой, потому что Javac примет classpath текущего каталога.

Как вы можете видеть ниже, javac не может найти мой Case класс, даже если он находится в том же каталоге. Есть мысли о том, почему это происходит? Этот код отлично работает, когда я использую Eclipse.

 C:Documents and SettingsjoepMy DocumentsGCJsrccodejam2011Round0D>dir /B
Case.class
Case.java
EntryPoint.java

C:Documents and SettingsjoepMy DocumentsGCJsrccodejam2011Round0D>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 SettingsjoepMy DocumentsGCJsrccodejam2011Round0D>
  

Обновление 1:

После попытки компиляции из моего корневого пакета (src) я получаю новую ошибку (даже после удаления Case.class файл)

 C:Documents and SettingsjoepMy DocumentsGCJsrc>javac -cp . codejam2011/Round0/D/EntryPoint.java

codejam2011Round0DEntryPoint.java:16: cannot access codejam2011.Round0.D.Case

bad class file: .codejam2011Round0DCase.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 SettingsjoepMy DocumentsGCJsrc>
  

Обновление 2:
Похоже, что он захватывает Case.java файл из другого пакета.

 C:Documents and SettingsjoepMy DocumentsGCJsrc>javac -d ../classes codejam2011Round0D*.java

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

bad class file: .codejam2011Round0DCase.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 SettingsjoepMy DocumentsGCJsrc>
  

Комментарии:

1. Вы импортировали регистр класса в EntryPoint?

2. @Danish: В этом нет необходимости, поскольку он находится в том же пакете.

3. Вы изучали сообщения об ошибках? duplicate class: codejam2011.Round0.C.Case Есть C и D — двусмысленность. Вы должны исключить некоторые импортируемые файлы или явно указать, в каком случае, codejam2011. Round0.C.Case или codejam2011. Вы имеете в виду Round0.D.Case.

4. @user Хотя они в разных пакетах. Почему компилятор запутался и пытается использовать один из другого пакета?

5. У меня нет общего обзора ваших исходных каталогов, ваших целевых каталогов, текущего каталога, переменных среды и истории ваших действий. Вы должны начать удалять все старые классы.

Ответ №1:

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

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

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

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

Комментарии:

1. Я получаю точно такую же ошибку, когда я устанавливаю путь к классу в . и я использую пакеты — может быть, поэтому это не работает? Мой пакет — codejam2011. Round0.D

2. Я обновил ответ. Я не ожидал, что вы компилируете изнутри пакета, это не так, как это должно быть сделано.

Ответ №2:

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

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

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

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

Комментарии:

1. Большое вам спасибо за ваш ответ и объяснение всего по порядку! Наконец, это решило проблему!

Ответ №3:

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

 location: class codejam2011.Round0.D.EntryPoint
  

Это говорит мне о том, что ваш пакет — codejam2011.Round0.D (что противоречит соглашению (все в нижнем регистре), но не относится к делу …

cd в родительский каталог codejam2011, который является src, не так ли?

 javac codejam2011Round0DEntryPoint.java
  

может сработать.

Часто у вас есть каталог для скомпилированных классов, например ‘bin’ или ‘classes’. Чтобы создать классы там, используйте -d (destination):

 javac -d ../classes codejam2011Round0DEntryPoint.java
  

Комментарии:

1. Спасибо за совет о соглашении о пакетах в нижнем регистре. Я это исправлю. Что касается компиляции, по-прежнему безуспешно

2. Что за новая ошибка? К какому пакету относится Case? Это в том же пакете (легко)? Ни в одном пакете (:=анонимный, невозможно). У вас есть специальный импорт для Case — я так не думаю. Попробуйте javac -d ../classes codejam2011Round0D*.java .

3. Регистр и точка входа находятся в одном пакете. (codejam2011. Round0.D)

4. И вы выполнили javac -d ../classes codejam2011Round0D*.java ? Сообщение об ошибке?

Ответ №4:

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