Następujący kod generuje NullPointerException
:
int num = Integer.getInteger("123");
Czy mój kompilator wywołuje getInteger
wartość null, ponieważ jest statyczny? To nie ma sensu!
Co się dzieje?
java
integer
nullpointerexception
api-design
autoboxing
user282886
źródło
źródło
Odpowiedzi:
Wielkie zdjęcie
Mamy tu do czynienia z dwoma problemami:
Integer getInteger(String)
nie robi tego, co myślisz, że robinull
tym przypadku powracaInteger
doint
powoduje automatyczne rozpakowywanieInteger
jestnull
,NullPointerException
jest rzucanyDo analizowania
(String) "123"
aby(int) 123
można użyć npint Integer.parseInt(String)
.Bibliografia
Integer
Dokumentacja APIstatic int parseInt(String)
static Integer getInteger(String)
Na
Integer.getInteger
Oto, co dokumentacja ma do powiedzenia na temat tego, co robi ta metoda:
Innymi słowy, ta metoda nie ma nic wspólnego z analizowaniem a
String
doint/Integer
wartości, a raczej zSystem.getProperty
metodą.Trzeba przyznać, że może to być sporym zaskoczeniem. Szkoda, że biblioteka ma takie niespodzianki, ale daje cenną lekcję: zawsze sprawdzaj dokumentację, aby potwierdzić, co robi metoda.
Zbiegiem okoliczności odmiana tego problemu została przedstawiona w prezentacji „ Return of the Puzzlers: Schlock and Awe (TS-5186)” , Josha Blocha i Neala Gaftera w 2009 roku w prezentacji JavaOne Technical Session. Oto slajd podsumowujący:
Dla kompletności istnieją również te metody, które są analogiczne do
Integer.getInteger
:Boolean.getBoolean(String)
Long.getLong(String)
Powiązane pytania
O autounboxingu
Inną kwestią jest oczywiście sposób
NullPointerException
rzucania. Aby skupić się na tym problemie, możemy uprościć fragment w następujący sposób:Oto cytat z Effective Java 2nd Edition, pozycja 49: Preferuj typy pierwotne od prymitywów pudełkowych:
Są miejsca, w których nie masz innego wyboru, jak tylko użyć prymitywów pudełkowych, np. Generycznych, ale w przeciwnym razie powinieneś poważnie rozważyć, czy decyzja o użyciu prymitywów pudełkowych jest uzasadniona.
Powiązane pytania
źródło
Integer.getInteger(s)
jest z grubsza równoważneInteger.parseInt(System.getProperty(s))
? Myślę, że wolę drugą, chociaż jest bardziej rozwlekła, ponieważ podkreśla fakt, że pobierasz informacje z właściwości systemu.Integer.decode
zamiastInteger.parseInt
, który szuka wiodącego0x
lub0
analizuje liczbę odpowiednio jako szesnastkową lub ósemkową.NullPointerException
? : programmers.stackexchange.com/questions/158908/ ...Z http://konigsberg.blogspot.com/2008/04/integergetinteger-are-you-kidding-me.html :
Chcesz to:
źródło
Sprawdź dokumentację metody getInteger () . W tej metodzie
String
parametr jest właściwością systemową, która określa wartość całkowitą właściwości systemowej o określonej nazwie. Jak omówiono tutaj, „123” nie jest nazwą żadnej właściwości systemowej . Jeśli chcesz przekonwertować ten ciąg naint
, użyj metody jakoint num = Integer.parseInt("123")
.źródło