Пользовательские исключения Java
Я хочу воспроизвести часть поведения InterruptedException, но я не понимаю, как это работает...
Итак, у меня есть этот код:
public static void main(String [] args){
try{
}catch(InterruptedException ie){
}
}
Когда я пытаюсь скомпилировать его, я получаю эту ошибку компилятора
Unreachable catch block for InterruptedException. This exception is never thrown from the try statement body
Я сделал пользовательское исключение, которое на самом деле не является исключением, потому что оно не расширяет исключение...
class MyException extends Throwable{
}
public static void main(String [] args){
try{
}catch(MyException ie){
}
}
Который показывает ту же ошибку компилятора
Unreachable catch block for MyException. This exception is never thrown from the try statement body
Тогда я сделал это
public static void main(String [] args){
try{
throw new MyException();
} catch(MyException e){
e.printStackTrace();
}
try{
throw new InterruptedException();
} catch(InterruptedException e){
e.printStackTrace();
}
}
И оба они компилируются нормально.
Но теперь приходит сложная часть..
public static void main(String [] args){
try{
throw new MyException();
} catch(Exception e){
e.printStackTrace();
} catch(MyException e){
e.printStackTrace();
}
try{
throw new InterruptedException();
} catch(Exception e){
e.printStackTrace();
} catch(InterruptedException e){
e.printStackTrace();
}
}
Компилятор говорит
Unreachable catch block for InterruptedException. It is already handled by the catch block for Exception
Можете ли вы рассказать мне, как InterruptedException отображает ошибку компилятора "Недоступный блок перехвата для InterruptedException. Это исключение никогда не выдается из тела оператора try" и одновременно расширяет Exception, потому что когда я расширяю исключение, мои пользовательские исключения не показывают этот компилятор ошибка
В качестве примера:
class MyException extends Exception{}
public static void main(String [] args){
try{
}catch(MyException me){
}
}
Этот код не выдает ошибку компилятора
Но следующий код делает
class MyException extends Throwable{}
public static void main(String [] args){
try{
}catch(MyException me){
}
}
2 ответа
Это происходит потому, что InterrupedException
это подкласс Exception
, но Exception
уже пойман предыдущим catch
блок.
Раздел 11.2.3 JLS гласит:
Это ошибка времени компиляции, если предложение catch может перехватить класс исключения E1, а предыдущее предложение catch непосредственно включенного оператора try может перехватить E1 или суперкласс E1.
Блок в InterruptedException
блок catch будет недоступным кодом, что будет оправданием этой ошибки компилятора.
Вы выбрасываете выбрасываемое исключение, поэтому оно должно быть выброшено откуда-то
кстати: мой компилятор показывает ошибку для 1-го сценария и для 2-го сценария