Почему Exception не ловит IOException?
Почему следующий фрагмент кода не компилируется, показывая ошибку в строке //2 (просит добавить исключение в сигнатуру метода)? Ведь с помощью Exception можно поймать и обработать IOException. Если убрать первый catch с отловом IOException, все компилируется.
public static void test() {
try {
throw new IOException();//1
} catch (IOException ex) {
System.out.println("2");
throw new IOException();//2
} catch (Exception e) {
System.out.println("3");//3
} finally {
System.out.println("4");//4
}
System.out.println("5");
}
Ответы (2 шт):
Почему следующий фрагмент кода не компилируется, показывая ошибку в строке //2
Потому что в строке //2 у вас выбрасывается исключение, но не ловится, а ловить исключения можно только в блоке try { ... }, а в catch уже происходит попытка поймать исключение, если оно подходит
Поэтому, или нужно в методе указывать, что оно может кинуть исключение:
public static void test() throws <Исключение> {
Либо в catch добавить try/catch
Потому что вы ловите исключения в этом блоке:
try {
throw new IOException();
}
а все остальные блоки catch() обрабатывают исключения, возникающие в блоке try(). Поэтому когда у вас происходит исключение IOException в блоке catch(), а исключение IOException проверяемое, то его в этом блоке никто не проверяет и компилятор ругается на ошибку.