2013-09-05 13 views
5

Voglio capire perché il seguente codice genera Eccezione puntatore nullo.Operatore prioritario - Operatori aritmetici e condizionali

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

Forse vuoi nomi == null? '0': names.size() – dcaswell

risposta

10

Il problema è che la sua dichiarazione di stampa è valutato come:

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

Ciò è dovuto al fatto che + has more precedence than ?: operator Così, come la stringa - "risultato è nullo" non è uguale a null, valutando names.size() getta NPE.

Si noti che, quando null viene utilizzato in concatenazione di stringhe, viene automaticamente convertito in "null". Pertanto, "Result is: " + null non genererà NPE. Questo è secondo JLS - String Conversion:

Se il riferimento è null, viene convertito nella stringa "null" (quattro caratteri ASCII n, u, l, l).

Per risolvere il problema, è necessario aggiungere le parentesi intorno alla vostra espressione condizionale per imporre una maggiore precendenza ad esso:

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

Correzione risposta di Jigar, questo in realtà funziona:

someString + null 

Per fissare il codice di OP, basta aggiungere tra parentesi - in questo modo le operazioni saranno eseguite nell'ordine corretto e il risultato sarà come previsto:

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

si sta scrivendo "Il risultato è:" + nomi che non è equivalente a null quindi sta tentando di stampare names.size(). Ma quando si chiama names.size() lanciare un'eccezione di puntatore nullo poiché i nomi sono ancora nulli.

Modifica

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

a

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

quindi si otterrà nulla come output.

Problemi correlati