#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.D2. Я обновил ответ. Я не ожидал, что вы компилируете изнутри пакета, это не так, как это должно быть сделано.
Ответ №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 и снова перестроил программу.