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?

War es hilfreich?

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
  • die Zuordnung von Integer zu int verursacht Auto-Unboxing
    • Da die Integer null ist, NullPointerException geworfen

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 oder null ist, oder wenn die Eigenschaft nicht das richtige Zahlenformat hat, dann wird null 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


    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 es NullPointerException 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").

    Lizenziert unter: CC-BY-SA mit Zuschreibung
    Nicht verbunden mit StackOverflow
    scroll top