В Java, если общее исключение будет перехвачено и переброшено, смогут ли внешние методы по-прежнему перехватывать определенные исключения?

В Java, если общее исключение будет перехвачено и переброшено, смогут ли внешние методы по-прежнему перехватывать определенные исключения?

Другими словами, могу ли я сделать это:


try {
    try {
         //...
    } catch (Exception e) {
         //...
        throw e;
    }
} catch (SpecificException e) {
     //...
}

3 ответа

Хотя ответ jtahlborn верен, есть еще одно признание: компилятор увидит, что вы генерируете исключение универсального типа (даже если во время выполнения это может быть только определенный класс), и заставит вас объявить универсальное исключение в заголовок метода.

private void test() throws FileNotFoundException {
    try {
        throw new FileNotFoundException("Es una exception");
    } catch (IOException e) {
        throw e; <-- Error because the method only throws
                       FileNotFoundException, not IOException
    }
}

e действительно является FileNotFoundException, но так как он объявлен как IOException, компилятор работает с более широким классом. То, что вы можете сделать, это "бросить" исключение.

        throw (FileNotFoundException) e;

Повторное выбрасывание исключения ничего не меняет в нем (это все тот же объект, изначально выданный).

Eclipse помечает "throw e" во внутренней перехватчике как необработанное исключение, НО оно перехватывает исключение, потому что когда я запускаю это, оно печатает "Сработало!". Спасибо @jtahlborn. К сожалению, это означает, что где-то все еще должен быть ненужный блок try/catch.


public class Tester {

    public static void main(String[] args) {
        try {
            try {
                throw new SpecificException("Test!");
            } catch (Exception e) {
                throw e;
            }
        } catch (SpecificException e) {
            System.out.println("It worked!");
        }
    }

}
Другие вопросы по тегам