Erklärt Java standardmäßig "throws Exception"?

8

Betrachten Sie folgende Klassen:

%Vor%

und

%Vor%

Aus dem, was ich in anderen Fragen gelesen habe ( Warum können nicht überschreibende Methoden Ausnahmen breiter als die überschriebene Methode auslösen? und Java-Methode werfen Ausnahme )

Ich verstehe, dass die überschreibende Methode in der Unterklasse entweder dieselbe oder eine Unterklasse der in der überschriebenen Methode geworfenen Ausnahme auslösen muss.

Werfen Java-Methoden immer mindestens eine Ausnahme vom Typ Exception?

vor

... Mit anderen Worten, der Compiler fügt throws Ausnahme

hinzu

Also würde die Klasse X so aussehen

%Vor%

Ich möchte klarstellen, dass ich mich nicht täusche über die Tatsache, dass der Standard-Exception-Handler Exception immer hinzugefügt wird.

Verwandte Fragen:

IOException vs RuntimeException Java

    
Anthony H 11.05.2015, 10:52
quelle

2 Antworten

6

Es gibt zwei Arten von Ausnahmen: Überprüfte Ausnahmen (wie ParseException beim Parsen von Text) und nicht markierte Ausnahmen (wie NullPointerException ).

Überprüfte Ausnahmen müssen in der Methodensignatur deklariert sein. Ungeprüfte Ausnahmen kann in der Methodensignatur deklariert werden.

Beim Überschreiben von Methoden (von einer Schnittstelle oder einer Superklasse) müssen Sie nur die Ausnahmen angeben, die Sie in Ihre Implementierung werfen . Sie können nicht deklarieren, dass in einer Implementierung überprüfte Ausnahmen ausgelöst werden, die in der überschriebenen Methode nicht zulässig sind.

Dies ist erlaubt:

%Vor%

Dies ist nicht erlaubt:

%Vor%

Dies ist auch erlaubt:

%Vor%     
slartidan 11.05.2015, 11:01
quelle
3

Was slartidan sagte in ihre Antwort ist völlig richtig. Um ein wenig mehr zu erklären:

Wenn Sie eine "Überprüfte Ausnahme" Innerhalb des Hauptteils einer Methode müssen Sie entweder mit einem catch-Block umgehen oder throws-clause

deklarieren

Um die zuvor verknüpfte JLS zu wiederholen:

  1. Eine Ausnahme ist eine Klasse Erweiterung Throwable
  2. Ein Fehler ist auch eine Klasse erweitert Throwable
    • Fehler sollten normalerweise nicht aufgefangen werden, weil sie auf ernsthafte Probleme hinweisen. (z.B. OutOfMemoryError )
    • catching Exception macht nicht Fehler
  3. Es gibt auch RuntimeException . Dies ist eine Klasse, die Exception erweitert.

Fehler und Laufzeitausnahmen sind nicht aktiviert bei der Kompilierzeit , denn genau das bedeutet "ausgecheckte Ausnahme".

Sie können Error s und RuntimeException s irgendwo in Ihrem Code ausgeben.

Wie wirkt sich das auf throws-Klauseln aus:

Eine throws-Klausel gibt an, dass ein Aufruf der deklarierten Methode zur Angabe der Ausnahme führen kann. Interessanterweise erwartet throws ein Throwable , was die folgende Deklaration gültig macht:

%Vor%

Es gibt keinen Compiler-Effekt, wenn in einer throws-Klausel nicht-geprüfte Exceptions deklariert werden, aber dies geschieht manchmal aus Gründen der Übersichtlichkeit in Ihrem Quellcode.

Zusätzlich werden solche Ausnahmen manchmal in JavaDoc erwähnt (zB BigInteger#divide )

Aber der Compiler überprüft die throws-Klausel beim Überschreiben von Methoden. Es ähnelt den Sichtbarkeitsregeln beim Überschreiben von Methoden. Dies bedeutet, dass das Auslösen von nicht aktivierten Exceptions (und das Deklarieren entsprechender throws-Klauseln) immer möglich ist. Folgende Erklärung gilt:

%Vor%

Es ist das gleiche umgekehrt. Ungeprüfte Ausnahmen in throws-Klauseln werden vom Compiler nicht berücksichtigt, da sie für die Überprüfung der Kompilierungszeit nicht relevant sind:

%Vor%

Die allgemeine Regel für die Vererbung von throws-Klauseln lautet: Eine Schnittstelle, um alle zu steuern: Die Schnittstelle muss alle geprüften Ausnahmen deklarieren, die von implementierenden Klassen ausgelöst werden können. Oder mit anderen Worten:

  

Implementierende Klassen können eine Teilmenge der deklarierten aktivierten Exceptions in der throws-Klausel der Schnittstellenmethode in der throws-Klausel der implementierenden Methode deklarieren

Dies bedeutet folgendes ist gültig:

%Vor%

Was nicht gültig ist, deklariert eine geprüfte Ausnahme in der throws-Klausel der Implementierungsmethode, die nicht in der entsprechenden Klausel der Schnittstellenmethode deklariert ist:

%Vor%     
Vogel612 11.05.2015 11:34
quelle