Warum löst int num = Integer.getInteger(“123”) eine NullPointerException aus?

Lesezeit: 4 Minuten

Warum lost int num IntegergetInteger123 eine NullPointerException aus
Benutzer282886

Der folgende Code wirft NullPointerException:

int num = Integer.getInteger("123");

Wird mein Compiler aufgerufen getInteger auf null, da es statisch ist? Das macht keinen Sinn!

Was ist los?

  • Verwenden Sie stattdessen Integer.getValue(). Dieser Blogbeitrag ist eine gute Erklärung, warum: königsberg.blogspot.in/2008/04/…

    – Pranaysharma

    26. April 2015 um 12:10 Uhr

1645703827 53 Warum lost int num IntegergetInteger123 eine NullPointerException aus
polygenelubricants

Das große Bild

Hier spielen zwei Probleme eine Rolle:

  • Integer getInteger(String) macht nicht das, was du denkst
    • Es kehrt zurück null in diesem Fall
  • der Auftrag von Integer zu int bewirkt ein automatisches Unboxing
    • Seit der Integer ist null, NullPointerException ist geworfen

Analysieren (String) "123" zu (int) 123Sie können z int Integer.parseInt(String).

Verweise

Integer API-Referenzen


An Integer.getInteger

Hier ist, was die Dokumentation darüber zu sagen hat, was diese Methode tut:

public static Integer getInteger(String nm): Ermittelt den ganzzahligen Wert der Systemeigenschaft mit dem angegebenen Namen. Wenn es keine Eigenschaft mit dem angegebenen Namen gibt, wenn der angegebene Name leer ist oder nulloder wenn die Eigenschaft nicht das richtige numerische Format hat, dann null ist zurück gekommen.

Mit anderen Worten, diese Methode hat nichts mit dem Parsen von a zu tun String zu einem int/Integer Wert, sondern hat damit zu tun System.getProperty Methode.

Zugegeben, das kann eine ziemliche Überraschung sein. Es ist bedauerlich, dass die Bibliothek solche Überraschungen bereithält, aber sie lehrt Sie eine wertvolle Lektion: Schlagen Sie immer in der Dokumentation nach, um zu bestätigen, was eine Methode tut.

Zufälligerweise wurde eine Variation dieses Problems in vorgestellt Rückkehr der Puzzler: Schlock und Ehrfurcht (TS-5186), Präsentation auf der JavaOne Technical Session 2009 von Josh Bloch und Neal Gafter. Hier ist die abschließende Folie:

Die Moral

  • In Bibliotheken lauern seltsame und schreckliche Methoden
    • Einige haben harmlos klingende Namen
  • Wenn sich Ihr Code schlecht verhält
    • Stellen Sie sicher, dass Sie die richtigen Methoden aufrufen
    • Lesen Sie die Bibliotheksdokumentation
  • Für API-Designer
    • Verletzen Sie nicht das Prinzip des geringsten Erstaunens
    • Verletzen Sie nicht die Abstraktionshierarchie
    • Verwenden Sie keine ähnlichen Namen für sehr unterschiedliche Verhaltensweisen

Der Vollständigkeit halber gibt es auch diese analogen Methoden Integer.getInteger:

Verwandte Fragen

  • Erstaunlichste Verletzung des Prinzips des geringsten Erstaunens
  • Die umständlichste/irreführendste Methode in der Java Base API?

Beim automatischen Unboxing

Die andere Frage ist natürlich, wie die NullPointerException wird geworfen. Um uns auf dieses Problem zu konzentrieren, können wir das Snippet wie folgt vereinfachen:

Integer someInteger = null;
int num = someInteger; // throws NullPointerException!!!

Hier ist ein Zitat aus Effective Java 2nd Edition, Item 49: Prefer primitive types to boxed primitives:

Zusammenfassend sollten Sie Primitiven immer dann bevorzugen, wenn Sie die Wahl haben. Primitive Typen sind einfacher und schneller. Wenn Sie geschachtelte Primitive verwenden müssen, seien Sie vorsichtig! Autoboxing reduziert die Ausführlichkeit, aber nicht die Gefahr, Boxed Primitives zu verwenden. Wenn Ihr Programm zwei eingerahmte Primitive mit dem vergleicht == Betreiber, führt er einen Identitätsvergleich durch, was mit ziemlicher Sicherheit nicht das ist, was Sie wollen. Wenn Ihr Programm gemischte Berechnungen mit Boxed- und Unboxed-Primitiven durchführt, führt es ein Unboxing durch, und wenn Ihr Programm ein Unboxing durchführt, kann es werfen NullPointerException. Wenn Ihr Programm schließlich primitive Werte verschachtelt, kann dies zu kostspieligen und unnötigen Objekterstellungen führen.

Es gibt Stellen, an denen Sie keine andere Wahl haben, als Boxed Primitives zu verwenden, zB Generika, aber ansonsten sollten Sie ernsthaft überlegen, ob eine Entscheidung für Boxed Primitives gerechtfertigt ist.

Verwandte Fragen

  • Was ist der Unterschied zwischen einem int und einem Integer in Java/C#?
  • Warum erlaubt mir Autoboxing in Java, 3 mögliche Werte für einen booleschen Wert zu haben?
  • Ist garantiert, dass new Integer(i) == i in Java? (JAWOHL!!!)
  • Tritt beim Vergleich zweier Ganzzahlen in Java ein automatisches Unboxing auf? (NEIN!!!)
  • Java-Noob: Generika nur über Objekte? (ja leider)

  • Damit Integer.getInteger(s) entspricht in etwa Integer.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 ziehen.

    – Tyler

    26. Juni 2010 um 19:54 Uhr

  • Sobald ich diesen Kommentar gepostet hatte, wurde mir klar, dass ich mir einfach die eigentliche Quelle der Integer-Klasse ansehen konnte! Ich war auf dem richtigen Weg, außer dass es nutzt Integer.decode anstatt Integer.parseIntdie nach einem führenden sucht 0x oder 0 um die Zahl als hexadezimal bzw. oktal zu analysieren.

    – Tyler

    26. Juni 2010 um 19:59 Uhr

  • Für die, die fragen Warum NullPointerException?: programers.stackexchange.com/questions/158908/…

    – RUMÄNIEN_Ingenieur

    28. Dezember 2015 um 13:07 Uhr


  • @Oracle können Sie java.lang.Integer.getInteger(String) bitte verwerfen?

    – mjaggard

    9. Oktober 2018 um 11:11 Uhr


1645703828 677 Warum lost int num IntegergetInteger123 eine NullPointerException aus
Kyren Johnstone

Von http://konigsberg.blogspot.com/2008/04/integergetinteger-are-you-kidding-me.html:

getInteger ‘Ermittelt den ganzzahligen Wert der Systemeigenschaft mit dem angegebenen Namen.’

Du willst das:

Integer.parseInt("123")

1645703828 453 Warum lost int num IntegergetInteger123 eine NullPointerException aus
Sonal Patil

Bitte überprüfen Sie die Dokumentation der Methode getInteger(). Bei dieser Methode wird die String parameter ist eine Systemeigenschaft, die den ganzzahligen Wert der Systemeigenschaft mit dem angegebenen Namen bestimmt. “123” ist nicht der Name irgendeiner Systemeigenschaft, wie besprochen Hier. Wenn Sie diesen String konvertieren möchten intdann verwenden Sie die Methode als
int num = Integer.parseInt("123").

842870cookie-checkWarum löst int num = Integer.getInteger(“123”) eine NullPointerException aus?

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy