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!

Co się dzieje?
Author: ROMANIA_engineer, 2010-06-26

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
  • przypisanie z Integer do int powoduje automatyczne unboxing
    • ponieważ Integer jest null, NullPointerException rzuca

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 lub null, lub jeśli właściwość nie ma poprawny format liczbowy, a następnie zwracane jest null.

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


On autounboxing

Inną kwestią jest oczywiście sposób, w jaki NullPointerException 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

 212
Author: polygenelubricants,
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")
 17
Author: Kieren Johnstone,
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").

 6
Author: Sonal Patil,
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