2013-09-05 7 views
5

Ich möchte verstehen, warum der folgende Code Nullzeiger Ausnahme wirft.Operator Vorrang - Arithmetische und bedingte Operatoren

import java.util.List; 

public class Test { 
    public static void main(String[] args) { 
     List<String> names = null; 
     System.out.println("Result is: " + names == null ? null : names.size()); 
    } 
} 
+0

Vielleicht möchten Sie Namen == null? '0': names.size() – dcaswell

Antwort

10

Das Problem ist, dass Ihre Print-Anweisung wird ausgewertet als:

System.out.println(("Result is: " + names) == null ? null : names.size()); 

Dies ist aufgrund der Tatsache, dass + has more precedence than ?: operator So, wie der String - "Ergebnis null ist" nicht gleich null, Bewertung names.size() NPE wirft.

Beachten Sie, dass wenn null in Zeichenfolge-Verkettung verwendet wird, wird es automatisch in "null" konvertiert. Also, "Result is: " + null wird nicht NPE werfen. Dies ist gemäß JLS - String Conversion:

Wenn die Referenz null ist, um es in die Zeichenfolge konvertiert wird "null" (vier ASCII-Zeichen n, u, l, l).

Um das Problem zu beheben, Sie Klammern um Ihren bedingten Ausdruck hinzufügen sollten größer precendence, um es zu erzwingen:

System.out.println("Result is: " + (names == null ? null : names.size())); 
4

Korrektur Jigar Antwort, die eigentlich arbeitet:

someString + null 

Um OPs Code zu beheben, nur Klammer hinzufügen - auf diese Weise die Vorgänge in der richtigen Reihenfolge durchgeführt werden und das Ergebnis wird sein, wie erwartet:

System.out.println("Result is: " + (names == null ? null : names.size())); 
2

Sie schreiben „Das Ergebnis ist:“ + Name, die nicht gleichwertig ist null so versucht es zu drucken names.size(). Aber wenn names.size() aufgerufen wird, wird eine Nullzeigerausnahme ausgelöst, da die Namen immer noch null sind.

Ändern

System.out.println("Result is: " + names == null ? null : names.size()); 

zu

System.out.print("Result is: "); 
System.out.println(names == null ? null : names.size()); 

dann werden Sie null als Ausgabe erhalten.