Dlaczego int num = Integer.getInteger ("123") throw NullPointerException?
Następujący kod rzuca NullPointerException
:
int num = Integer.getInteger("123");
Czy mój kompilator wywołuje getInteger
Na null, ponieważ jest statyczny? To nie ma sensu!
3 answers
The Big Picture
W grze są dwa problemy:
-
Integer getInteger(String)
nie robi tego, co myślisz, że robi- zwraca
null
w tym przypadku
- zwraca
- przypisanie z
Integer
doint
powoduje automatyczne unboxing- ponieważ
Integer
jestnull
,NullPointerException
rzuca
- ponieważ
Aby przetworzyć (String) "123"
do (int) 123
, możesz użyć np. int Integer.parseInt(String)
.
Referencje
Integer
odniesienia do API
On Integer.getInteger
Oto, co dokumentacja ma do powiedzenia na temat tego, co robi ta metoda:
public static Integer getInteger(String nm)
: określa wartość całkowitą właściwości systemowej o podanej nazwie. Jeśli nie ma właściwości o podanej nazwie, jeśli podana nazwa jest pusta lubnull
, lub jeśli właściwość nie ma poprawny format liczbowy, a następnie zwracane jestnull
.
Innymi słowy, ta metoda nie ma nic wspólnego z parsowaniem String
do int/Integer
wartości, ale raczej ma to związek z System.getProperty
metoda.
Przyznaję, że to może być niespodzianka. Szkoda, że biblioteka ma takie niespodzianki, ale daje cenną lekcję: zawsze sprawdzaj dokumentację, aby potwierdzić, co robi metoda.
Przypadkowo, odmianą tego problemu było wyróżnione w Return Of The Puzzlers: Schlock and Awe (TS-5186), Josh Bloch i Neal Gafter ' s 2009 JavaOne Technical Session presentation. Oto końcowy slajd:
Moralność
- dziwne i straszne metody czają się w bibliotekach
- niektóre mają niewinnie brzmiące imiona
- jeśli twój kod źle się zachowuje
- upewnij się, że wywołujesz właściwe metody
- przeczytaj bibliotekę dokumentacja
- dla projektantów API
- nie naruszaj zasady najmniejszego zdziwienia
- nie naruszaj hierarchii abstrakcji
- nie używaj podobnych nazw dla szalenie różnych zachowań
Dla kompletności istnieją również te metody, które są analogiczne do Integer.getInteger
:
Powiązane pytania
- najbardziej zdumiewające naruszenie zasady najmniejszego zdziwienia
- najbardziej niewygodna / myląca metoda W Java Base API ?
On autounboxing
Inną kwestią jest oczywiście sposób, w jakiNullPointerException
zostaje wyrzucony. Aby skupić się na tym zagadnieniu, możemy uprościć fragment w następujący sposób:]}
Integer someInteger = null;
int num = someInteger; // throws NullPointerException!!!
[[29]} oto cytat z Effective Java 2nd Edition, pozycja 49: preferuj prymitywne typy niż pudełkowe prymitywy: [30]}
Podsumowując, używaj primitives zamiast boxed primitive, gdy masz wybór. Prymitywne typy są prostsze i szybsze. Jeśli musisz używać pudełkowych prymitywów, uważaj! Autoboxing zmniejsza werbalność, ale nie niebezpieczeństwo używania pudełkowych prymitywów. Kiedy twój program porównuje dwa pudełkowe prymitywy z operatorem
==
, dokonuje porównania tożsamości, co prawie na pewno nie jest tym, czego chcesz. Gdy twój program wykonuje obliczenia typu mieszanego z użyciem pudełka i pudełka primitives, to robi unboxing, a kiedy twój program robi unboxing, to może rzucićNullPointerException
. Wreszcie, gdy twój program ustawia prymitywne wartości, może to spowodować kosztowne i niepotrzebne tworzenie obiektów.
Są miejsca, w których nie masz wyboru, jak tylko używać prymitywów pudełkowych, np. generyków, ale poza tym powinieneś poważnie rozważyć, czy decyzja o użyciu prymitywów pudełkowych jest uzasadniona.
Podobne pytania
- Jaka jest różnica między int i Integer w Javie / C#?
- dlaczego autoboxing w Javie pozwala mi mieć 3 Możliwe wartości dla logiki?
- czy jest zagwarantowane, że nowa liczba całkowita (i) = = i w Javie? (tak!!!)
- czy podczas porównywania dwóch liczb całkowitych w Javie występuje automatyczne unboxing? (nie!!!)
- Java noob: generyki tylko nad obiektami? (tak, niestety)
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-05-23 11:54:50
Z http://konigsberg.blogspot.com/2008/04/integergetinteger-are-you-kidding-me.html :
GetInteger ' określa wartość całkowitą właściwości systemowej o podanej nazwie.'
Chcesz tego:
Integer.parseInt("123")
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-06-26 09:28:52
Proszę sprawdzić dokumentację metody getInteger () .
W tej metodzie parametr String
jest właściwością systemową, która określa wartość całkowitą właściwości systemowej o podanej nazwie. "123" nie jest nazwą żadnej właściwości systemowej, jak opisano tutaj .
Jeśli chcesz przekonwertować ten łańcuch na int
, użyj metody jako
int num = Integer.parseInt("123")
.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-06-26 19:22:44