Null-Rückgaben in ternären Operatoren vs. If-Anweisungen
Bedenken Sie den folgenden Java-Codeausschnitt:
<code class="java">public class Main { private int temp() { return true ? null : 0; } private int same() { if (true) { return null; } else { return 0; } } public static void main(String[] args) { Main m = new Main(); System.out.println(m.temp()); System.out.println(m.same()); } }</code>
In die temp()-Methode, der ternäre Operator true ? null : 0 prüft, ob true wahr ist und gibt null zurück, andernfalls wird 0 zurückgegeben. Obwohl der Rückgabetyp der Methode ein int ist, lässt der Compiler die Rückgabe von null zu. Beim Ausführen des Codes wird jedoch eine NullPointerException ausgelöst.
In der Methode same() versucht die if-Anweisung, null zurückzugeben, wenn „true“ wahr ist, aber der Compiler meldet einen Fehler bei der Kompilierung aufgrund einer inkompatiblen Rückgabe Typen.
Warum der Unterschied?
Der Hauptunterschied besteht darin, wie der Compiler null im ternären Operator und in der if-Anweisung interpretiert. Im ternären Operator wird null als Nullverweis auf ein Integer-Objekt behandelt. Gemäß den Autoboxing- und Unboxing-Regeln (Java Language Specification, 15.25) wird der Nullwert beim Unboxing automatisch in einen int umgewandelt, was zu einer NullPointerException führt, wenn der int verwendet wird.
Im Gegensatz dazu prüft die if-Anweisung explizit die Wahrhaftigkeit des Ausdrucks true und versucht, null zurückzugeben, was mit dem deklarierten Rückgabetyp eines int nicht kompatibel ist. Daher generiert der Compiler einen Kompilierzeitfehler, um eine fehlerhafte Codeausführung zu verhindern.
Das obige ist der detaillierte Inhalt vonWarum verursacht eine Null-Rückgabe eine NullPointerException in einem ternären Operator, aber einen Fehler bei der Kompilierung in einer If-Anweisung?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!