2013-09-05 8 views

Odpowiedz

10

problem jest, że instrukcja print jest oceniany jako:

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

Wynika to z faktu, że + has more precedence than ?: operator Tak, jak struny - "Wynikiem jest null" nie jest równa null, oceny names.size() rzuca NPE.

Należy pamiętać, że w przypadku łączenia null jest on automatycznie konwertowany na "null". Tak więc "Result is: " + null nie będzie rzucać NPE. Jest to zgodnie z JLS - String Conversion:

Jeśli odwołanie jest null przekształcany jest do łańcucha "null" (cztery znaków ASCII, n, u, l, l).

Aby rozwiązać ten problem, należy dodać nawiasów wokół wyrażenia warunkowego wymusić większą precendence do niego:

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

Poprawianie odpowiedź Jigar, ten rzeczywiście działa:

someString + null 

Aby rozwiązać kod OP, wystarczy dodać nawias - w ten sposób operacje będą wykonywane w odpowiedniej kolejności, a wynik będzie zgodnie z oczekiwaniami:

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

piszesz „Wynik jest:” + nazwy co nie jest równoznaczne z null, więc stara się wydrukować names.size(). Ale gdy jest wywoływana names.size(), wyrzuca ona wyjątek wskaźnika null jako nazwy, wciąż jest pusta.

Zmienić

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

do

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

wtedy dostaniesz null jako wyjście.

Powiązane problemy