Kiedy piszę mojego kodu Java tak:Dziwne zachowanie przy użyciu Java potrójny operator
Map<String, Long> map = new HashMap<>()
Long number =null;
if(map == null)
number = (long) 0;
else
number = map.get("non-existent key");
aplikacja działa zgodnie z oczekiwaniami, ale kiedy to zrobić:
Map<String, Long> map = new HashMap<>();
Long number= (map == null) ? (long)0 : map.get("non-existent key");
otrzymuję NullPointerException na druga linia. Wskaźnik debugowania przeskakuje od drugiej linii do tej metody w klasie java.lang.Thread:
/**
* Dispatch an uncaught exception to the handler. This method is
* intended to be called only by the JVM.
*/
private void dispatchUncaughtException(Throwable e) {
getUncaughtExceptionHandler().uncaughtException(this, e);
}
Co się tutaj dzieje? Obie te ścieżki kodowe są dokładnie równoważne, czyż nie?
Edit
używam Java 1.7 U25
Dlaczego testujesz na niemożliwe? Sam tworzysz 'mapę'; jeśli jest 'null', twój system runtime jest uszkodzony. Ponieważ jest to oczywiście skrócona wersja innego wykonywanego przez ciebie dzieła, sugerowałbym, abyś upewniał się, że obiekty są zawsze inicjowane, więc nie musisz wykonywać sprawdzeń 'map == null'. Klucze to twój problem. –
@Eric Jablow To jest tylko uproszczona wersja mojego kodu. Ta mapa jest faktycznie pobierana z innego miejsca, w którym są one dynamicznie tworzone na żądanie. Właśnie dlatego czek. Tutaj zawarłem inicjalizację, aby było jasne dla ludzi, którzy odpowiadają, że przypadek "prawda-prawdziwy" nie jest wykonywany, gdy pojawia się mój problem. – radiantRazor
Teraz rozumiem. Prawdopodobnie najlepszą rzeczą byłoby natychmiastowe zgłoszenie wyjątku, gdyby ktoś przekazał nam kod 'null'. Lub, jeśli ktoś poda 'null' do twojego kodu, zamiast tego ustaw twoją mapę na pustą. –