2014-12-19 2 views
6

Betrachten Sie die folgende Schnittstelle:Warum muss der Aufrufer der Methode, die eine Ausnahme auslöst, in dieser Situation nicht mit der Ausnahme umgehen?

package hf; 

public interface BadInterface 
{ 
    void meth() throws Exception; 
} 

die durch die folgende Klasse implementiert wird:

package hf; 

public class apples implements BadInterface 
{ 
    public static void main(String[] args) 
    { 
     new apples().meth(); 
    } 

    public void meth() 
    { 
     System.out.println("Ding dong meth."); 
    } 
} 

Obwohl meth() ist eine Methode, die eine Ausnahme auslöst, wird der Anrufer des Verfahrens Meth() Sie müssen die Ausnahme nicht behandeln oder deklarieren, und dennoch wird das Programm erfolgreich ausgeführt. Warum ist das der Fall? Verstößt es nicht gegen die Regel, dass Sie beim Aufrufen einer Methode, die eine Ausnahme auslöst, die Ausnahme abfangen oder deklarieren müssen, dass Sie die Ausnahme selbst auslösen?

+0

Sie sollten Ihre Klasse in 'Äpfel' umbenennen, um den Java-Codierungsnormen zu entsprechen. –

Antwort

7

Wenn Sie eine Schnittstellenmethode implementieren, dürfen Sie deklarieren, dass Sie weniger Ausnahmen als in der Schnittstelle angegeben auslösen. Wenn Sie new apples().meth() aufrufen, rufen Sie meth() auf einer apples Instanz auf. Der Compiler weiß, dass das nichts bringt, also geht es dir gut.

Hatten Sie getan:

BadInterface foo = new apples(); // Note: should be Apples (code style) 
foo.meth(); 

dann würden Sie die Ausnahme erklärt in der Schnittstelle fangen müssen, weil der Compiler es zu tun mit einer BadInterface Instanz nur weiß.

+0

Beachten Sie auch, dass Ausnahmen nicht Teil der Signatur einer Methode sind. Aus diesem Grund können Sie die Methode implementieren, ohne die Option "throws Exception" hinzufügen zu müssen. Sie können auch Ausnahmen hinzufügen: 'public void meth() löst IOException aus, FooException' – Davio

+1

@Davio Ausnahmen sind in einer Signatur sicherlich relevant - Sie können beispielsweise keine geprüften Ausnahmen auslösen, die nicht in der Schnittstelle aufgelistet sind. –

+1

Der kürzliche, passendere Begriff ist "Form", relevant für Lambda-Konvertierungen. Deklarierte Ausnahmen tragen definitiv zur Form der Methode bei. –

0

Nach JLS Requirements in Overriding and Hiding:

B ist eine Klasse oder Schnittstelle, und A eine Superklasse oder Superschnitt von B, und ein Verfahren Erklärung m2 in B überschreibt oder versteckt eine m1 Verfahren Erklärung dann in A. :

Für wirft in den aufgeführten jeden geprüfte Art Ausnahmeklausel von m2, selber Ausnahmeklasse oder eines seiner übergeordneten Typen in den Löschen (§4.6) die throws-Klausel von m1 erfolgen muss; Andernfalls tritt ein Kompilierungsfehler auf.

Bedeutet, dass die extending-Methode nur eine stärkere Ausnahmerichtlinie haben kann. Wenn es die schwächeren Beschränkungen hat, kann solche Methode anstelle der Grundmethode nicht verwendet werden und es bricht das Konzept des Überschreibens ab.

Verwandte Themen