Überschriebene Methoden können keine Exceptions werfen Java [duplicate]

8

Dies ist mein Codeblock.

%Vor%

Dieser Code kann nicht kompiliert werden, da ich "throws" in Zeile1 hinzugefügt habe.

Der Compiler beklagt sich, dass überschriebene Methoden keine Ausnahmen auslösen können.

Warum?

Warum kann eine überschriebene Methode keine Ausnahme auslösen?.

Weil ich eine Methode von einer Basisklasse überschreiben kann, indem ich in der Klassenimplementierung des Kindes n Codezeilen hinzufüge.

Und dieser hinzugefügte Code kann eine Ausnahme auslösen, weshalb ich "throws" in der überschriebenen Methode nicht verwenden kann?.

    
UnderDog 25.08.2013, 05:37
quelle

6 Antworten

13

Überschriebene Methoden können Exceptions auslösen, solange die überschriebene Methode dieselben Exceptions auslöst. Sie können keine neuen Ausnahmen einführen.

Warum können Sie also keine neue Ausnahme einführen?

Eines der zentralen Konzepte von OOP ist die Verwendung abstrakter Typen, und alle Subtypen können als abstrakter Typ behandelt werden. Siehe Liskow-Substitutionsprinzip

Der Grund, warum Sie kein breiteres Verhalten einführen können, ist, dass wenn die Methode vom abstrakten Typ (Superklasse oder Schnittstelle) keine Ausnahme auslöst und Sie auf Ihr Objekt als diesen Typ verweisen, Sie unerwartetes Verhalten erhalten würden:

%Vor%

Wenn Alphas myMethod() keine Ausnahme auslöst, aber Beta tut , könnten wir eine unerwartete Ausnahme im obigen Code bekommen.

    
Bohemian 25.08.2013, 05:41
quelle
5

Die Methode "Unterklasse überschreiben" kann nur eine unkontrollierte Ausnahme auslösen (deklarieren) wie ArrayIndexOutOfBoundsException.

Aber Sie können die geprüfte Ausnahme nicht auslösen (deklarieren). wie IOException.

Beispiel zu verriden Methoden werfen Ausnahmen Java

%Vor%

Hoffe, dass diese Ihnen helfen können.

    
PVH 14.05.2014 14:59
quelle
3

Ihre Kundenseite denkt immer daran, sich mit der Basisversion zu beschäftigen. Das ist der ganze Vorteil von Polymorphismus = & gt; Client-Seite ignoriert den überschriebenen.

Somit wird nichts dazu führen, dass der Client mit bestimmten Regeln umgehen muss, die durch die Überschreibung gemacht werden, hier der Fall einer möglichen Ausnahme, die von der überschriebenen Methode ausgelöst wird.

Aus diesem Grund kann eine überschriebene Methode keine breiteren Ausnahmen auslösen. Es würde den Vertrag brechen.

In Bezug auf diese Logik lautet die Regel also: Overriden-Methode CAN (wenn es gewünscht wird) wirft nur einen Teil der in der Basisversion deklarierten Ausnahmen, ABER KANN NICHT breitere werfen.

    
Mik378 25.08.2013 05:41
quelle
1

Die Regel sagt

  

"Überschriebene Methoden der Unterklasse können nicht mehr Ausnahmen auslösen als die von   Superklassenmethode ".

    
Juned Ahsan 25.08.2013 05:39
quelle
0
  

Der Compiler beschwert sich, dass überschriebene Methoden keine Ausnahmen auslösen können

Nein, tut es nicht. Lesen Sie die Nachricht erneut. Es besagt, dass Sie keine Ausnahme auslösen können, die nicht durch die überschriebene Methode ausgelöst wird. Nicht die gleiche Sache überhaupt.

    
EJP 25.08.2013 06:05
quelle
0

Ihren obigen Code in der Hauptmethode

Alpha g = neue Beta (); // Jetzt wird ein neues Objekt der Klasse Beta mit Verweis auf Alpha

erstellt

g.Gamma (); // * jetzt Compiler-Look nur Gamma () -Methode präsentiert in Alpha-Klasse off Source in Beta-Klasse auch standardmäßig durch Vererbung.aber Compiler schaute nur auf Klasse Alpha und eine Frage zu stellen ist eine Methode Gamma () enthält und eine Antwort gefunden ja es hat.

nehme eine Bedingung an, wenn der Java-Compiler die Möglichkeit bietet, mehr überprüfte Ausnahmen in der gamma () -Methode in Beta-Klasse zu werfen, was dann passieren wird

  • jetzt zum Kompilierzeit Compiler nur von Gamma () -Methode der Klasse Alpha.. erzwingt nicht, um diese Ausnahme zu behandeln oder löst diese Ausnahme, die falsch ist, weil es werfen könnte (vorausgesetzt, Java-Compiler erlauben werfen mehr checked Ausnahme in überschrieben Methode). aber in Wirklichkeit macht der Compiler keine Beschränkung auf das Auslösen von Ausnahmen, sondern auch auf den Accessibility-Modifikator.

    weil nicht-ständiger Methodenaufruf auf der tatsächlichen Objektmethode und nicht auf dem Typ geschieht und wir einem beliebigen Super-Typ und zum Kompilierungszeitcompiler nur die Zugänglichkeit und Präsenz in diesem Typ der zugewiesenen Klasse zuweisen.

Ich denke, das ist der Grund für diesen überschriebenen Vertrag

• Die Methodendefinition kann die Erreichbarkeit der Methode nicht einschränken, aber sie kann es erweitern. • Die Methodendefinition kann nur alle oder keine oder eine Teilmenge der Überprüfte Ausnahmen (einschließlich ihrer Unterklassen), die in den Würfen angegeben sind Klausel der überschriebenen Methode in der Oberklasse.

    
vikas singh 18.10.2013 09:59
quelle

Tags und Links