2014-11-10 11 views
5

Poniższy kod kompiluje się poprawnie, mimo że blok try nie powoduje żadnego wyjątku.Wyjątek wyjątku języka Java Wyjątek w porównaniu z wyjątkiem IOException

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

Ale jeśli połów zostanie zastąpiony podtypem wyjątku, kod nie zostanie skompilowany.

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

Błąd kompilatora: Nieosiągalny blok catch dla wyjątku IOException. Ten wyjątek nigdy nie jest generowany z treści instrukcji try.

W jaki sposób to zachowanie, gdy wyjątki dotyczą wyjątku IOException wyjątku &? Używam Java 7.

+0

'Wyjątki RuntimeException's są również' wyjątkami', więc nie wszystkie wyjątki są sprawdzane. –

Odpowiedz

6

Kompilator może wiedzieć dokładnie, jaka część kodu może rzucić IOException ponieważ jest to sprawdzone wyjątku, więc każda metoda, która może rzucić tego rodzaju wyjątku należy podać go w metodzie podpis.

Z drugiej strony, wykonywania lub niekontrolowanych wyjątkami nie są przeznaczone do przewidzenia, a od RuntimeException (klasa dominująca niekontrolowanych wyjątkami) rozciąga się również klasę Exception, wówczas kompilator jest w porządku z nim.

3

Exception ma podklasy, które nie są zaznaczone wyjątki (RuntimeException rozciąga Exception). Throwable będzie zachowywać się podobnie. RuntimeException lub podklasy RuntimeException będą zachowywać się podobnie. Podklasy Exception inne niż RuntimeException nie będą.

3

odpowiedź Manouti wydaje się poprawne, ale według dokumentacji Java:

Jest to błąd kompilacji Jeżeli połowy klauzula catch sprawdzana typu wyjątek E1 ale nie istnieje sprawdzony typ wyjątku E2 tak, że wszystkie następujące hold:

E2 <: E1 spróbować bloku odpowiadającej klauzuli catch może rzucać E2 Nie poprzednim bloku połów bezpośrednio otaczającej instrukcji try połowy E2 lub supertypem E2. , chyba że E1 jest wyjątkiem klasowym.

Istnieje wyraźny przypadek do rzucania instancji Exception (klasa Exception jest wyjątkowy, można by rzec).Jest to dokumentacja Java 5, ale jeśli ktoś widzi inaczej, ja wątpię to się zmieniło od

Patrząc na drzewie dziedziczenia dla Exception i IOException

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

i

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

w języku Java 7, nie widzę, że dyskusja na temat Wyjątków zaznaczonych/Niezaznaczonych ma bezpośrednie znaczenie - podczas gdy to prawda, że ​​odznaczenie ed wyjątki nie przestrzegają tych samych zasad, niesprawdzonych wyjątki muszą dziedziczyć RuntimeException, który Exception oczywiście nie robi (jest rodzicem tej klasy)

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

(znowu Java 5 docs, ale nie uległa zmianie) https://docs.oracle.com/javase/specs/jls/se5.0/html/exceptions.html

Powiązane problemy