2014-11-10 3 views
5

Следующий код компилируется нормально, даже если блок try фактически не выбрасывает исключение.Исключение исключения исключений Java Исключение против IOException

public static void main(String[] args) { 
    try {} 
    catch (Exception e) {} // compiles ok 
} 

Но если улов заменен подклассом Exception, код не будет компилироваться.

public static void main(String[] args) { 
    try {} 
    catch (IOException e) {} // won't compile. 
} 

Ошибка компилятора: недостижимый блок catch для исключения IOException. Это исключение никогда не выбрасывается из тела оператора try.

Как это происходит, когда оба исключения & IOException проверяются исключениями? Я использую Java 7.

+0

'RuntimeException' также являются 'Exception', поэтому не все Исключения проверяются. –

ответ

6

компилятор может точно знать, какая часть кода может бросить IOException, потому что это проверяемое исключение, так что каждый метод, который может бросить такого рода исключения необходимо указать его в методе подпись.

С другой стороны, время выполнения или непроверенных исключений не предназначены следовало ожидать, и так как RuntimeException (родительский класс непроверенных исключений) также расширяет класс Exception, то компилятор нормально с ним.

3

Exception имеет подклассы, которые являются неотмеченными исключениями (RuntimeException). Exception). Throwable будет вести себя аналогичным образом. RuntimeException или подклассы RuntimeException будут вести себя аналогичным образом. Подклассы Exception, кроме RuntimeException, не будут.

3

ответ Manouti кажется правильным, но в соответствии с документацией Java:

Это ошибка времени компиляции, если оговорка поймать уловы проверяются тип исключения E1, но не существуют проверенного типа исключения Е2 таких, что все справедливы следующий:

< E2: E1 Пробный блок, соответствующий пункту уловов могут бросить E2 Нет предшествующий поймать блок сразу ограждающей Ьга заявления уловов E2 или надтип E2. , если E1 не является исключением класса.

Существует явный случай для метания в Exception экземпляра (Exception класс является исключительным, можно сказать).Это документация Java 5, но если кто-то не видит, в противном случае, я очень сомневаюсь, что это изменилось с тех пор

Глядя на дерево наследования для Exception и IOException

https://docs.oracle.com/javase/7/docs/api/java/lang/Exception.html

и

https://docs.oracle.com/javase/7/docs/api/java/io/IOException.html?is-external=true

в Java 7, я не вижу, что обсуждение исключений Checked/Unchecked имеет прямое отношение - хотя это правда, что снять флажок Ed исключения не следуют тем же правилам, непроверенные исключения должны наследовать от RuntimeException, который Exception, конечно, не делает (он является родителем этого класса)

https://docs.oracle.com/javase/specs/jls/se5.0/html/classes.html#308526

(опять же, Java 5 Docs, но не изменилось) https://docs.oracle.com/javase/specs/jls/se5.0/html/exceptions.html

Смежные вопросы