пользовательское исключение в java: «не удается найти символ», если он явно не импортирован

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