Question

Le code suivant lance NullPointerException:

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

Mon compilateur invoquer getInteger sur null depuis sa statique? Cela ne fait aucun sens!

Qu'est-ce qui se passe?

Était-ce utile?

La solution

The Big Picture

Il y a deux questions en jeu ici:

  • Integer getInteger(String) ne fait pas ce que vous pensez qu'elle
    • Il retourne null dans ce cas
  • l'affectation de Integer à int provoque l'auto-unboxing
    • Depuis la Integer est null, NullPointerException est jeté

Pour analyser (String) "123" à (int) 123, vous pouvez utiliser par exemple int Integer.parseInt(String).

Références

Integer références API


Sur Integer.getInteger

Voici ce que la documentation ont à dire sur ce que cette méthode fait:

  

public static Integer getInteger(String nm) : détermine la valeur de nombre entier de la propriété système avec le nom spécifié. S'il n'y a pas de propriété avec le nom spécifié, si le nom spécifié est vide ou null, ou si la propriété n'a pas le format numérique correct, null est retourné.

En d'autres termes, cette méthode n'a rien à voir avec l'analyse d'un String à une valeur int/Integer, mais plutôt, il doit faire avec System.getProperty procédé.

Il est vrai que cela peut être tout à fait une surprise. Il est regrettable que la bibliothèque a des surprises comme cela, mais il ne vous apprend une leçon précieuse:. Chercher toujours la documentation pour confirmer ce qu'une méthode ne

Coincindentally, une variante de ce problème a été présenté dans Boolean.getBoolean(String)

  • Long.getLong(String)
  • Questions connexes


    Sur autounboxing

    L'autre question, bien sûr, est de savoir comment le NullPointerException est jeté. Pour se concentrer sur cette question, nous pouvons simplifier l'extrait comme suit:

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

    Voici une citation de Effective Java 2e édition, article 49: Préférez les types primitifs de primitives en boîte:

      

    En résumé, les primitives d'utilisation, de préférence à chaque fois que vous primitive boxed avez le choix. Les types primitifs sont plus simples et plus rapides. Si vous devez utiliser des primitives en boîte, faites attention! Autoboxing réduit la verbosité, mais pas le danger, l'utilisation de primitives en boîte. Lorsque votre programme compare deux primitives en boîte avec l'opérateur ==, il fait une comparaison d'identité, ce qui est presque certainement pas ce que vous voulez. Lorsque votre programme fait des calculs de type mixte impliquant des primitives Boxé et sans emballage, il fait unboxing, et quand votre programme ne unboxing, il peut jeter NullPointerException. Enfin, lorsque vos boîtes de programme valeurs primitives, il peut entraîner des créations d'objets coûteux et inutiles.

    Il y a des endroits où vous avez pas d'autre choix que d'utiliser des primitives en boîte, par exemple génériques, mais sinon, vous devriez sérieusement envisager si une décision d'utiliser des primitives en boîte est justifiée.

    Questions connexes

    Autres conseils

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

      

    getInteger »détermine la valeur entière de la propriété système avec le nom spécifié.

    Vous voulez ceci:

    Integer.parseInt("123")
    

    S'il vous plaît vérifier la documentation de la méthode getInteger () . Dans ce procédé, le paramètre String est une propriété de système qui détermine la valeur entière de la propriété système avec le nom spécifié. « 123 » est pas le nom d'une propriété système, tel que discuté . Si vous voulez convertir cette chaîne à int, puis utilisez la méthode comme int num = Integer.parseInt("123").

    Licencié sous: CC-BY-SA avec attribution
    Non affilié à StackOverflow
    scroll top