5

Ошибка "Не удается найти символ" или "Не удается разрешить символ": что это значит?

12

Ошибка "Не удается найти символ", "Не удается разрешить символ" или "Символ не найден" в Java

Пожалуйста, объясните следующее о таких ошибках, как "Не удается найти символ", "Не удается разрешить символ" или "Символ не найден" в Java:

  • Что они означают?
  • Что может их вызывать?
  • Как программист может их исправить?

Этот вопрос предназначен для создания обширного раздела вопросов и ответов о распространенных ошибках компиляции в Java.

5 ответ(ов)

0

Вы также получите эту ошибку, если забудете ключевое слово new:

String s = String();

в отличие от

String s = new String();

Дело в том, что вызов без ключевого слова new попытается найти (локальный) метод с именем String, не принимающий аргументов. Вероятнее всего, такой метод не определен, что и вызывает ошибку.

0

РЕШЕНО

Используйте IntelliJ: выберите СборкаПересобрать проект. Это решит проблему.

0

Еще один пример ошибки 'Переменная вне области видимости'

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

Рассмотрим следующий код:

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 будет доступна вне условных блоков, и код будет работать корректно.

0

Если вы получаете эту ошибку на этапе сборки в другом месте, когда ваша IDE утверждает, что всё в порядке, то проверьте, что вы используете одинаковые версии Java в обоих местах.

Например, Java 7 и Java 8 имеют разные API, поэтому вызов несуществующего API в более старой версии Java приведёт к возникновению этой ошибки.

0

Я тоже сталкивался с этой ошибкой (я погуглил и был направлен на эту страницу).

Проблема: Я вызывал статический метод, определенный в классе проекта A, из класса, определенного в другом проекте B.

Я получал следующую ошибку:

error: cannot find symbol

Решение: Я решил эту проблему, сначала собрав проект, где был определён метод, а затем проект, из которого вызывался этот метод.

Чтобы ответить на вопрос, пожалуйста, войдите или зарегистрируйтесь