Warum int num = Integer.getInteger ( „123“) werfen Nullpointer?
-
30-09-2019 - |
Frage
Der folgende Code führt NullPointerException
:
int num = Integer.getInteger("123");
Ist mein Compiler Aufruf getInteger
auf null, da es statische? Das macht keinen Sinn!
Was ist los?
Lösung
The Big Picture
Es gibt zwei Probleme hier im Spiel:
-
Integer getInteger(String)
macht nicht das, was Sie denken, es tut- Sie gibt
null
in diesem Fall
- Sie gibt
- die Zuordnung von
Integer
zuint
verursacht Auto-Unboxing- Da die
Integer
null
ist,NullPointerException
geworfen
- Da die
Um analysiert (String) "123"
zu (int) 123
, können Sie zum Beispiel int Integer.parseInt(String)
.
Referenzen
Integer
API-Referenzen
Auf Integer.getInteger
Hier ist, was die Dokumentation zu sagen haben, was diese Methode funktioniert:
public static Integer getInteger(String nm)
: Ermittelt den ganzzahligen Wert der Systemeigenschaft mit dem angegebenen Namen. Wenn es keine Eigenschaft mit dem angegebenen Namen ist, wenn der angegebene Name leer odernull
ist, oder wenn die Eigenschaft nicht das richtige Zahlenformat hat, dann wirdnull
zurückgegeben.
Mit anderen Worten, hat diese Methode nichts mit Analyse einen String
zu einem int/Integer
Wert zu tun, sondern vielmehr hat es mit System.getProperty
Methode.
Allerdings kann dies durchaus eine Überraschung sein. Es ist bedauerlich, dass die Bibliothek Überraschungen wie diese hat, aber es hat teach Sie eine wertvolle Lektion. Immer in der Dokumentation zu bestätigen nachschauen, was eine Methode funktioniert
Coincindentally, eine Variation dieses Problems wurde in Boolean.getBoolean(String)
Long.getLong(String)
Verwandte Fragen
- erstaunlichste Verletzung des Prinzips der geringsten Astonishment
- heikelsten / irreführende Methode in Java Base-API?
Auf autounboxing
Die andere Frage ist natürlich, ist, wie die NullPointerException
geworfen wird. Um auf dieses Problem zu konzentrieren, können wir die Schnipsel vereinfachen, wie folgt:
Integer someInteger = null;
int num = someInteger; // throws NullPointerException!!!
Hier ist ein Zitat von Effective Java 2nd Edition, Punkt 49: Bevorzugen primitive Typen boxed Primitiven:
Insgesamt Verwendung Primitiven in Vorzug primitive geboxt, wenn Sie die Wahl haben. Primitive Typen sind einfacher und schneller. Wenn Sie boxed Primitive verwenden müssen, seien Sie vorsichtig! Autoboxing reduziert die Ausführlichkeit, aber nicht die Gefahr, von boxed Primitive verwenden. Wenn Ihr Programm zwei geschachtelte Primitive mit dem
==
Operator vergleicht, tut es eine Identität Vergleich, der nicht mit ziemlicher Sicherheit ist das, was Sie wollen. Wenn Ihr Programm Mischtyp-Berechnungen durchführt denen boxed und unboxed Primitiven, tut es Unboxing, und wenn Ihr Programm Unboxing der Fall ist, kann esNullPointerException
werfen. Schließlich, wenn Ihr Programm Boxen primitive Werte, kann sie in teure und unnötige Objekterstellungen zur Folge haben.
Es gibt Orte, wo man keine andere Wahl als boxed Primitiven zu verwenden, z.B. Generika, aber ansonsten sollten Sie ernsthaft in Erwägung ziehen, wenn eine Entscheidung boxed Primitiven zu verwenden gerechtfertigt ist.
Verwandte Fragen
Andere Tipps
http://konigsberg.blogspot.com /2008/04/integergetinteger-are-you-kidding-me.html :
getInteger ‚Bestimmt den ganzzahligen Wert der Systemeigenschaft mit dem angegebenen Namen.‘
Sie möchten diese:
Integer.parseInt("123")
Bitte überprüfen Sie Dokumentation des Verfahrens getInteger () .
Bei diesem Verfahren ist die String
Parameter eine Systemeigenschaft, die den ganzzahligen Wert der Systemeigenschaft mit dem angegebenen Namen bestimmt. „123“ ist nicht der Name einer Systemeigenschaft, wie diskutiert hier .
Wenn Sie diese Zeichenfolge in int
konvertieren wollen, dann verwenden Sie die Methode als
int num = Integer.parseInt("123")
.