2017-12-18 4 views
1

Warum kompiliert der folgende Code ordnungsgemäß, aber die aufgerufene Methode muss Exception nicht werfen? Ist Exception eine geprüfte Ausnahme und keine unkontrollierte Ausnahme? Bitte klären Sie.Ausnahme muss nicht ausgelöst werden, um abgefangen zu werden, aber IOException tut

class App { 
    public static void main(String[] args) { 
     try { 
      amethod(); 
      System.out.println("try "); 
     } catch (Exception e) { 
      System.out.print("catch "); 
     } finally { 
      System.out.print("finally "); 
     } 
     System.out.print("out "); 
    } 
    public static void amethod() { } 
} 

Wenn ich einen Versuch fängt mit IOexception (a geprüfte Ausnahme) verwendet werden soll, wobei das Verfahren Bedürfnisse genannt IOException zu werfen. Ich verstehe das.

import java.io.IOException; 

class App { 
    public static void main(String[] args) { 
     try { 
      amethod(); 
      System.out.println("try "); 
     } catch (IOException e) { 
      System.out.print("catch "); 
     } finally { 
      System.out.print("finally "); 
     } 
     System.out.print("out "); 
    } 
    public static void amethod() throws IOException { } 
} 
+2

Ich denke, dein Verständnis ist rückwärts. Die "throws" -Deklaration soll die geprüften Ausnahmen auflisten, die vom Angerufenen ausgelöst werden, und nicht diejenigen, die vom Aufrufer abgefangen werden. –

Antwort

1

Ist das nicht 'Exception' eine geprüfte Ausnahme und nicht eine ungeprüfte Ausnahme?

Ja, ist es.

Aber selbst wenn wir wissen, dass die Methode nicht Exception selbst wirft, könnte der Code catch(Exception e){ noch ausgeführt werden. Der Code im try Block könnte immer noch etwas werfen, das von Exception erbt. Dazu gehören RuntimeException und seine Unterklassen, die nicht markiert sind.

catch(IOException e){, auf der anderen Seite, kann nur checked Ausnahmen abfangen. (Java erlaubt keine Mehrfachvererbung, daher kann alles, was eine Unterklasse von IOException ist, möglicherweise keine Unterklasse von RuntimeException sein.) Der Compiler kann relativ leicht herausfinden, dass keiner der Codes im try Block eine IOException (seit Jede Methode, die eine geprüfte Exception auslöst, muss das explizit angeben), wodurch der Code markiert werden kann.

+0

perfekt! einfach zu verstehen –

1

Das Verhalten, das Sie beobachten, stammt aus der Tatsache, dass die Java-Sprachspezifikation in diesem Fall Exception behandelt. Nach §11.2.3:

Es ist ein Fehler bei der Kompilierung, wenn eine Klausel Fang kann geprüft Ausnahmeklasse E fängt und es ist nicht der Fall, dass der try Block zur catch Klausel entsprechenden kann werfen eine geprüfte Ausnahmeklasse, die eine Unterklasse oder eine Oberklasse von E ist, es sei denn, E ist Exception oder eine Oberklasse von Exception.

Dies ist sinnvoll, weil Exception (und ihr Ober Throwable) verwendet werden kann, Ausnahmen zu fangen, die RuntimeException auch erweitern. Da Laufzeitausnahmen immer möglich sind, lässt der Compiler immer Exception in einer catch-Klausel erscheinen, unabhängig vom Vorhandensein geprüfter Ausnahmen.

Verwandte Themen