11 Stimmen

Wie kann ich eine Methode für ein Null-Objekt aufrufen?

public class JavaPuzzler {

    public static void main(String[] args) {
    JavaPuzzler javaPuzzler = null;
    System.out.println(javaPuzzler.get());
    }

    private static String get(){
        return "i am a java puzzler";
    }
}

Man könnte meinen, dass es eine NullPointerException auslösen sollte, weil die Hauptmethode die get()-Methode auf lokale Variable, die initialisiert wird auf null und man kann keine Methode auf null aufrufen.

Aber wenn du dieses Programm ausführst, wirst du sehen, dass es "i am a java puzzler" ausgibt.

Kann mir jemand die Antwort geben? Vielen Dank im Voraus.

1voto

Mithun Sasidharan Punkte 20254

Wenn wir versuchen, eine Methode mit einem NULL-Objekt aufzurufen, wird die NullPointerException so lange die Methode nicht statisch ist.

Wenn die Methode statisch ist, wird sie ausgeführt.

Lesen Sie HIER für weitere Referenzen

1voto

Sudhir Jonathan Punkte 16099

Wie hier bereits erwähnt wurde, funktioniert es, weil get() ist eine statische Methode. Hier ist eine Möglichkeit, wie Sie sich das vorstellen können:

Wenn Sie in Java eine Klasse definieren, legen Sie im Wesentlichen die Daten fest, die ein Objekt enthalten soll, sowie eine Reihe von Methoden, die mit diesen Daten arbeiten. Sie können zwar Tausende und Abertausende von Objekten haben, aber es macht keinen Sinn, Kopien aller Methoden für jedes dieser Objekte zu haben. Was passiert, ist, dass die Klasse die von Ihnen definierten Methoden speichert und sie in der Umfang des Objekts, für das Sie die Methode aufrufen. Wenn Sie versuchen, diese Methoden für ein nicht initialisiertes Objekt aufzurufen, ist das Objekt noch vorhanden und die Methode existiert auch noch, aber sie hat keinen gültigen Gültigkeitsbereich, in dem sie arbeiten kann, so dass Sie die NullPointerException .

Die Ausnahme von dieser Regel sind statische Methoden, d. h. Methoden, die keinen Geltungsbereich benötigen - sie beziehen sich nicht auf objektspezifische Daten. Aus diesem Grund können sie unabhängig davon ausgeführt werden, ob das Objekt initialisiert ist oder nicht.

Denken Sie daran, dass Objekte keine Kopien ihrer Methoden haben... die Methoden werden nur im Bereich der Daten des Objekts aufgerufen. Sie können also immer noch auf die Methoden von null (nicht initialisierten) Objekten zugreifen, aber nicht-statische Methoden haben keine Daten, mit denen sie arbeiten können.

0voto

muratgu Punkte 7079

Der Compiler wandelt den Instanzaufruf automatisch in einen Klassenaufruf um. Wenn Sie einen Decompiler haben, können Sie die Änderung im generierten Bytecode beobachten:

...
 public static main([Ljava/lang/String;)V
   L0
    LINENUMBER 8 L0
    ACONST_NULL
    ASTORE 1
   L1
    LINENUMBER 9 L1
    GETSTATIC java/lang/System.out : Ljava/io/PrintStream;
    INVOKESTATIC JavaPuzzler.get()Ljava/lang/String;
    INVOKEVIRTUAL java/io/PrintStream.println(Ljava/lang/String;)V
   L2
    LINENUMBER 11 L2
    RETURN
   L3
    LOCALVARIABLE args [Ljava/lang/String; L0 L3 0
    LOCALVARIABLE javaPuzzler LJavaPuzzler; L1 L3 1
    MAXSTACK = 2
    MAXLOCALS = 2
...

0voto

In dem obigen Code haben Sie die Funktion get() als statisch angegeben. Statische Funktionen und Datenelemente gehören zu keinem Objekt. Sie gehören zu der Klasse. Sie können statische Funktionen über ein Objekt der Klasse aufrufen, aber das ist kein guter Ansatz, da er zusätzlichen Speicher verbraucht.

Da statisch, JavaPuzzler.get()); wird Ihnen die Ausgabe und nicht null pointer Ausnahme.

Es hätte eine Null-Zeiger-Ausnahme gegeben, wenn die get()-Methode nicht statisch gewesen wäre.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X