Ошибка "Не удается найти символ" или "Не удается разрешить символ": что это значит?
Ошибка "Не удается найти символ", "Не удается разрешить символ" или "Символ не найден" в Java
Пожалуйста, объясните следующее о таких ошибках, как "Не удается найти символ", "Не удается разрешить символ" или "Символ не найден" в Java:
- Что они означают?
- Что может их вызывать?
- Как программист может их исправить?
Этот вопрос предназначен для создания обширного раздела вопросов и ответов о распространенных ошибках компиляции в Java.
5 ответ(ов)
Вы также получите эту ошибку, если забудете ключевое слово new
:
String s = String();
в отличие от
String s = new String();
Дело в том, что вызов без ключевого слова new
попытается найти (локальный) метод с именем String
, не принимающий аргументов. Вероятнее всего, такой метод не определен, что и вызывает ошибку.
РЕШЕНО
Используйте IntelliJ: выберите Сборка → Пересобрать проект. Это решит проблему.
Еще один пример ошибки 'Переменная вне области видимости'
Я уже видел подобные вопросы несколько раз, так что, возможно, будет полезно привести еще один пример того, что является недопустимым, даже если это может показаться нормальным.
Рассмотрим следующий код:
if(somethingIsTrue()) {
String message = "Все в порядке";
} else {
String message = "У нас ошибка";
}
System.out.println(message);
Этот код недействителен. Потому что ни одна из переменных с именем message
не видна за пределами соответствующей области видимости — в данном случае это фигурные скобки {}
.
Вы можете сказать: "Но переменная с именем message определена в любом случае — значит, message определена после if
".
Но вы будете не правы.
В Java нет операторов free()
или delete
, поэтому язык полагается на отслеживание области видимости переменных, чтобы определить, когда они больше не используются (вместе с ссылками на эти переменные, конечно).
Это особенно проблематично, если вы считали, что сделали что-то хорошее. Я видел такие ошибки после "оптимизации" кода, например, так:
if(somethingIsTrue()) {
String message = "Все в порядке";
System.out.println(message);
} else {
String message = "У нас ошибка";
System.out.println(message);
}
"О, здесь дублированный код, давайте вытащим эту общую строку" — и вот она.
Наиболее распространенный способ решения этой проблемы с областью видимости — это предварительно присвоить значения для else
переменной в области видимости выше, а затем изменить их в if
:
String message = "У нас ошибка";
if(somethingIsTrue()) {
message = "Все в порядке";
}
System.out.println(message);
Таким образом, переменная message
будет доступна вне условных блоков, и код будет работать корректно.
Если вы получаете эту ошибку на этапе сборки в другом месте, когда ваша IDE утверждает, что всё в порядке, то проверьте, что вы используете одинаковые версии Java в обоих местах.
Например, Java 7 и Java 8 имеют разные API, поэтому вызов несуществующего API в более старой версии Java приведёт к возникновению этой ошибки.
Я тоже сталкивался с этой ошибкой (я погуглил и был направлен на эту страницу).
Проблема: Я вызывал статический метод, определенный в классе проекта A, из класса, определенного в другом проекте B.
Я получал следующую ошибку:
error: cannot find symbol
Решение: Я решил эту проблему, сначала собрав проект, где был определён метод, а затем проект, из которого вызывался этот метод.
Инициализация ArrayList в одну строчку
Почему нет ConcurrentHashSet, если есть ConcurrentHashMap?
Как объявить массив в одну строку?
Загрузка JDK Java на Linux через wget приводит к отображению страницы лицензии вместо установки
Создание репозитория Spring без сущности