Ist Java Ausnahmeklasse aktiviert?

8

Hier ist ein Beispiel, das das gegensätzliche Verhalten der Java Klasse 'Exception' zeigt.

%Vor%

Wenn der überprüfte Ausnahmetyp einen catch-Block enthält, ohne dass ein Fehler zu dieser bestimmten checked exception im try-Block führt, dann wird der Compiler einen Fehler wie "Diese Ausnahme wird niemals aus dem try-Statement-Body geworfen" auslösen. . Aber im obigen Fall gibt der Compiler keinen Fehler.

Wenn andererseits eine Ausnahme vom Typ Exception-Klasse ausgelöst wird, indem das Schlüsselwort throw verwendet wird, wird die Exception nicht wie in

zu einem Aufrufer duckt %Vor%

Im obigen Fall gibt der Compiler den Fehler "Unhandled Exception Type Exception".

Also, ist Java Exception-Klasse aktiviert oder deaktiviert?

Danke Raj.

    
raj 08.12.2011, 05:01
quelle

5 Antworten

8

Exception ist eine geprüfte Ausnahme. Von Abschnitt 11.2 der JLS :

  

Die nicht aktivierten Ausnahmeklassen sind die Klasse RuntimeException und ihre Unterklassen sowie die Klasse Error und seine Unterklassen. Alle anderen Ausnahmeklassen sind geprüfte Ausnahmeklassen.

Allerdings ist das Verhalten, das Sie sehen, in der Lage, es zu fangen, ohne etwas in dem try-Block, der erklärt wird, etwas zu werfen, wegen Abschnitt 14.20 der JLS :

  

Es ist ein Fehler bei der Kompilierung, wenn eine catch-Klausel den überprüften Ausnahmetyp E1 abfängt, aber es gibt keinen überprüften Ausnahmetyp E2, so dass alle folgenden Punkte gelten:

     
  • E2 & lt ;: E1
  •   
  • Der try-Block, der der catch-Klausel entspricht, kann E2
  • ausgeben   
  • Kein vorangehender catch-Block der unmittelbar umschließenden try-Anweisung fängt E2 oder einen Supertyp von E2 ab.
  •   

außer E1 ist die Klasse Exception.

Der Grund dafür ist RuntimeException , was eine nicht kontrollierte Ausnahme Unterklasse von Exception ist. Im Gegensatz zu allen anderen überprüften Ausnahmen ist es für catch (Exception) möglich, eine ungeprüfte Ausnahme abzufangen, die (in einem vereinfachten Modell) möglicherweise von any try -Block ausgelöst wird. Im Grunde vermischt sich RuntimeException mit der Ausnahmehierarchie: (

    
Jon Skeet 08.12.2011 05:05
quelle
2

RuntimeException, Error und ihre Unterklassen sind nicht markierte Ausnahmen. Rest alle inklusive Super-Klassen werden überprüft. Natürlich kann als überprüfte Ausnahme die Unterklasse von Exception sein, sie muss selbst überprüft werden.

    
Ashwinee K Jha 08.12.2011 05:07
quelle
1

Was Sie über Ausnahmen wissen sollten:

  • Exceptions sind geprüft , dh wenn sie als throws deklariert sind, müssen sie behandelt (gefangen) werden. Grob sind diese für "Nicht-Programmierfehler". zB IOException
  • RuntimeExceptions (eine Unterklasse von Exception ) sind nicht markiert , was bedeutet, dass sie nicht behandelt werden müssen, wenn sie deklariert sind, und sie können ausgelöst werden, wenn sie nicht deklariert werden. Grob sind diese für "Programmierfehler". zB NullPointerException
  • Errors sind deaktiviert, aber nicht Exceptions (siehe unten). Diese sind für "nicht behebbare" Fehler. zB OutOfMemoryError
  • Throwable ist die abstrakte Elternklasse aller oben genannten

Versuchen Sie Folgendes:

%Vor%

oder wenn Sie sowohl Laufzeit- als auch Nicht-Laufzeit-Ausnahmen erwarten:

%Vor%     
Bohemian 08.12.2011 05:02
quelle
0

Jon Skeet war in der Nähe, hat es aber nicht genau verstanden ... Er hat die throw Aussage nicht erklärt. Ihre Antwort dazu finden Sie im Abschnitt 14.18 - The throw Statement der Java-Sprachspezifikation, insbesondere:

  

Der Ausdruck in einer throw-Anweisung muss eine Variable oder einen Wert von angeben   ein Referenztyp, der dem Typ Throwable, oder zuweisbar ist (§5.2)   Ein Fehler bei der Kompilierung tritt auf. Darüber hinaus mindestens eines der folgenden   Drei Bedingungen müssen wahr sein oder ein Fehler bei der Kompilierung tritt auf:

     
  • Die Ausnahme ist keine geprüfte Ausnahme (§11.2) - insbesondere eine von   die folgenden Situationen sind wahr:   
    • Der Typ des Ausdrucks ist der   Klasse RuntimeException oder eine Unterklasse von RuntimeException.
    •   
    • Der Typ von   Der Ausdruck ist die Klasse Error oder eine Unterklasse von Error.
    •   
  •   
  • Der Wurf   Anweisung ist im try-Block einer try-Anweisung enthalten (§14.20)   und der Typ des Ausdrucks ist dem Typ des Attributs zuweisbar (§5.2)   Parameter von mindestens einer catch-Klausel der try-Anweisung. (In diesem   Fall wir sagen, der geworfene Wert wird von der try-Anweisung abgefangen.)
  •   
  • Der   Die throw-Anweisung ist in einer Methode oder Konstruktordeklaration enthalten   und der Typ des Ausdrucks ist mindestens eins zuzuweisen (§5.2)   Typ, der in der throws-Klausel (§8.4.6, §8.8.5) der Deklaration aufgeführt ist.
  •   

Sie werfen ein Exception , was kein RuntimeException oder eine Teilmenge von RuntimeException ist. Keine der anderen Bedingungen gilt auch.

Um dies zu überprüfen, werfen Sie einen new RuntimeException() und sehen Sie, ob der Compiler sich beschwert.

    
Paul 08.12.2011 05:22
quelle
0

Geprüfte Ausnahme Die Ausnahme, die vom Java-Compiler zur reibungslosen Ausführung des Programms zur Laufzeit überprüft wird, heißt Checked Exception.

  1. Vollständig markierte Ausnahme Die ausgewählte Ausnahme wird nur dann vollständig geprüft, wenn alle untergeordneten Klassen überprüft wurden. IOException, InterruptedException etc.

  2. Teilweise überprüfte Ausnahme Eine markierte Ausnahme wird nur dann teilweise überprüft, wenn einige ihrer untergeordneten Klassen deaktiviert sind. In der gesamten Ausnahmehierarchie sind die nur teilweise geprüften Ausnahmen Ausnahme und Throwable

Ungeprüfte Ausnahme Die Ausnahme, die nicht vom Java-Compiler ausgelöst wird, ob die Ausnahme ausgelöst wird oder nicht, heißt Unchecked Exception.

Hinweis: Ausnahmeklasse ist weder aktiviert noch deaktiviert. Es ist eine teilweise geprüfte Ausnahme.

    
Mohammad Shamshuddeen 20.01.2017 22:57
quelle

Tags und Links