Der folgende Code wirft NullPointerException
:
int num = Integer.getInteger("123");
Ruft mein Compiler getInteger
null auf, da er statisch ist? Das macht keinen Sinn!
Was ist los?
java
integer
nullpointerexception
api-design
autoboxing
user282886
quelle
quelle
Antworten:
Das große Bild
Hier spielen zwei Probleme eine Rolle:
Integer getInteger(String)
tut nicht das, was du denkstnull
in diesem FallInteger
bisint
bewirkt das automatische EntpackenInteger
heißtnull
,NullPointerException
geworfen wirdAnalysieren
(String) "123"
zu(int) 123
können Sie zB verwendenint Integer.parseInt(String)
.Verweise
Integer
API-Referenzenstatic int parseInt(String)
static Integer getInteger(String)
Auf
Integer.getInteger
In der Dokumentation wird Folgendes zu dieser Methode gesagt:
Mit anderen Worten, diese Methode hat nichts mit dem Parsen von a
String
zu einemint/Integer
Wert zu tun, sondern mit derSystem.getProperty
Methode.Zugegeben, das kann eine ziemliche Überraschung sein. Es ist bedauerlich, dass die Bibliothek solche Überraschungen bietet, aber sie lehrt Sie eine wertvolle Lektion: Schauen Sie immer in der Dokumentation nach, um zu bestätigen, was eine Methode tut.
Zufälligerweise wurde eine Variante dieses Problems in Return of the Puzzlers vorgestellt: Schlock und Awe (TS-5186) , Josh Bloch und Neal Gafters Präsentation der JavaOne Technical Session 2009. Hier ist die abschließende Folie:
Der Vollständigkeit halber gibt es auch diese Methoden, die analog sind zu
Integer.getInteger
:Boolean.getBoolean(String)
Long.getLong(String)
Verwandte Fragen
Beim Autounboxen
Das andere Problem ist natürlich, wie das
NullPointerException
geworfen wird. Um uns auf dieses Problem zu konzentrieren, können wir das Snippet wie folgt vereinfachen:Hier ist ein Zitat aus Effective Java 2nd Edition, Punkt 49: Bevorzugen Sie primitive Typen gegenüber primitiven Boxen:
Es gibt Orte, an denen Sie keine andere Wahl haben, als Box-Primitive zu verwenden, z. B. Generika. Andernfalls sollten Sie ernsthaft überlegen, ob eine Entscheidung zur Verwendung von Box-Primitiven gerechtfertigt ist.
Verwandte Fragen
quelle
Integer.getInteger(s)
also ungefähr gleichbedeutend mitInteger.parseInt(System.getProperty(s))
? Ich glaube, ich bevorzuge die zweite, obwohl sie ausführlicher ist, weil sie die Tatsache hervorhebt, dass Sie Informationen aus den Systemeigenschaften abrufen.Integer.decode
stattdessen verwendetInteger.parseInt
, was nach einem führenden Wert sucht0x
oder0
die Zahl als hexadezimal bzw. oktal analysiert.NullPointerException
? : programmers.stackexchange.com/questions/158908/…Von http://konigsberg.blogspot.com/2008/04/integergetinteger-are-you-kidding-me.html :
Du willst das:
quelle
Bitte überprüfen Sie die Dokumentation der Methode getInteger () . Bei dieser Methode ist der
String
Parameter eine Systemeigenschaft, die den ganzzahligen Wert der Systemeigenschaft mit dem angegebenen Namen bestimmt. "123" ist nicht der Name einer Systemeigenschaft, wie hier erläutert . Wenn Sie diesen String in konvertieren möchtenint
, verwenden Sie die Methode alsint num = Integer.parseInt("123")
.quelle