2015-02-12 11 views
24
public class TestMain { 

    public static void methodTest(Exception e) { 
     System.out.println("Exception method called"); 
    } 

    public static void methodTest(Object e) { 
     System.out.println("Object method called"); 
    } 

    public static void methodTest(NullPointerException e) { 
     System.out.println("NullPointerException method called"); 
    } 

    public static void main(String args[]) { 
     methodTest(null); 
    } 
} 

Ausgang: Nullpointer Methode namensMehrere überladene Methoden: Ist null gleich NullPointerException?

+6

Was passiert, wenn Sie 'methodTest ((Objekt) null) verwenden;'? oder 'methodTest ((Exception) null);'? – MadProgrammer

+1

Wenn methodTest ((Objekt) null) verwendet wird, dann ist die Ausgabe "Objektmethode aufgerufen". Wenn methodTest ((Exception) null) verwendet wird, dann ist die Ausgabe "Exception method called". –

+0

Also 'null' ist keine' NullPointerException', warum der Compiler diese Methode aufruft, wenn der Aufruf mehrdeutig ist, weiß ich nicht. – MadProgrammer

Antwort

38

Wenn es mehrere überladene Methoden sind, die mit einem bestimmten Parameter (null in Ihrem Fall) der Compiler den speziellsten man wählt nennen könnte.

Siehe http://docs.oracle.com/javase/specs/jls/se7/html/jls-15.html#jls-15.12.2.5

In Ihrem Fall methodTest(Exception e) ist spezifischer als methodTest(Object e), da Exception eine Unterklasse von Object ist. Und methodTest(NullPointerException e) ist noch spezifischer.

Wenn Sie NullPointerException durch eine andere Unterklasse von Exception ersetzen, wird der Compiler diese auswählen.

Auf der anderen Seite, wenn Sie eine zusätzliche Methode wie testMethod(IllegalArgumentException e) machen, wird der Compiler einen Fehler werfen, da es nicht weiß, welche zu wählen.

+0

Falsch, wenn 'IllegalArgumentException' verwendet wird, ruft es den' methodTest (Exception e) 'auf. – Runcorn

+2

@Runcorn Hast du das wirklich versucht? Es funktioniert wie in meiner Antwort beschrieben. –

+0

Complier löst einen Fehler aus, wenn beide öffentlichen statischen void methodTest (NullPointerException e) { \t \t System.out.println ("NullPointerException-Methode aufgerufen"); \t } \t public static void methodTest (ArrayIndexOutOfBoundsException e) { \t \t System.out.println ("ArrayIndexOutOfBoundsException Methode genannt"); \t} \t vorhanden sind und druckt, wenn nur public static void methodTest (ArrayIndexOutOfBoundsException e) { \t \t System.out.println ("ArrayIndexOutOfBoundsException Methode namens") "ArrayIndexOutOfBoundsException Methode namens"; \t} \t ist vorhanden –

9

Der Compiler versuchen wird, mit dem die meisten spezifischen Parameter übereinstimmen, die in diesem Fall NullPointerException ist. Sie können weitere Informationen in der Java Language Specification, Abschnitt 15.12.2.5. Choosing the Most Specific Method siehe:

Wenn mehr als ein Mitglied Verfahren zugänglich und anwendbar auf einen Methodenaufruf ist, ist es notwendig, ein zu wählen, die Beschreibung für die zu schaffen, Laufzeitversand Die Java-Programmiersprache verwendet die Regel, dass die spezifischste Methode ausgewählt wird. Die informelle Intuition besteht darin, dass eine Methode spezifischer ist als eine andere, wenn irgendein Aufruf, der von der ersten Methode behandelt wurde, an die andere ohne einen Kompilierzeit-Typfehler übergeben werden konnte.

[...]

+0

In [Java Puzzlers] (http://www.javapuzzlers.com/) von Joshua Bloch und Neal Gafter gibt es ein Puzzle, das diesem Verhalten der "spezifischsten Methode" gewidmet ist. – Timmos

Verwandte Themen