#java #exception #compiler-errors
#java #исключение #ошибки компилятора
Вопрос:
Я пытаюсь перехватить исключение в java, однако при перехватывании исключения я получаю cannot find symbol
сообщение об ошибке. Ошибка находится на catch (ItemNotFoundException infe)
, и компилятор жалуется, что ItemNotFoundException
нет известного класса (символа). Обратите внимание, что ItemNotFoundException
это член класса FeedController
.
Класс, который вызывает ошибку:
public class WebResource {
public Entry getEntry() {
String id = "490d6c15";
try {
Entry entry = FeedController.getInstance().getEntry(id);
} catch (ItemNotFoundException infe) {
return null;
}
return FeedController.getInstance().getEntry("490d6c15");
}
}
Класс FeedController, который генерирует исключение:
public class FeedController {
public Entry getEntry(String id) throws ItemNotFoundException {
if(!index.containsKey(id)) throw new ItemNotFoundException(id);
return index.get(id);
}
public static class ItemNotFoundException extends Exception {
public ItemNotFoundException(String id) {
super(String.format("item with id %s does not exist", id));
}
}
}
Я также попытался безжалостно импортировать все в WebResource, что импортирует FeedController, чтобы устранить отсутствующий импорт.
Комментарии:
1. Конечно, ваша трассировка стека указывает по номеру строки точное местоположение проблемы в вашем коде. Возможно, включение трассировки и подозрительной строки помогло бы.
2. о да, я только что понял, я недостаточно конкретен / что / действительно вызывает ошибку: это ссылка
ItemNotFoundException
на первый кодовый блок (строка 6).3. И вы его импортировали?
4. Есть ли вероятность, что вы работаете с Java Content Repository (JCR)? Исключение ItemNotFoundException является немного общим — любой может создать исключение с таким именем, поэтому разрешение пространства имен на основе того, что вы делаете, кажется, является ключевым здесь. Для начала попробуйте javax.jcr.ItemNotFoundException. Помимо этого, выясните, с какими пакетами вы работаете, и посмотрите, существует ли там ваше исключение.
5. Oha! Да, я только что понял, что исключение не является стандартным, а реализовано внутри класса
FeedController
. Однако этот символ импортируется. Исключение является членом самогоFeedController
класса, так что я должен называть его какFeedController.ItemNotFoundException
?
Ответ №1:
Безжалостный импорт всего, что импортируется классом, который генерирует это исключение, может не дать вам пакет, содержащий исключение. Найдите полное имя исключения; оно должно быть в javadoc для метода, который вы вызываете.
Ответ №2:
Хорошо, оказывается, мне пришлось явно импортировать пользовательское исключение из класса, то есть:
import feedviewer.controller.FeedController.ItemNotFoundException;
В противном случае компилятор не знал бы, где найти исключение.
Обратите внимание, что использование catch (FeedController.ItemNotFoundException e)
не будет работать. Вы должны использовать фактическое исключение, поэтому вам нужно импортировать его вручную.