Le code suivant jette NullPointerException
:
int num = Integer.getInteger("123");
Mon compilateur invoque-t-il getInteger
sur null car il est statique? Cela n'a aucun sens!
Que ce passe-t-il?
java
integer
nullpointerexception
api-design
autoboxing
user282886
la source
la source
Réponses:
La grande image
Il y a deux problèmes en jeu ici:
Integer getInteger(String)
ne fait pas ce que tu penses qu'il faitnull
dans ce casInteger
àint
provoque un déballage automatiqueInteger
estnull
,NullPointerException
est jetéPour analyser
(String) "123"
à(int) 123
, vous pouvez utiliser par exempleint Integer.parseInt(String)
.Références
Integer
Références APIstatic int parseInt(String)
static Integer getInteger(String)
Sur
Integer.getInteger
Voici ce que la documentation a à dire sur ce que fait cette méthode:
En d'autres termes, cette méthode n'a rien à voir avec l'analyse
String
d'uneint/Integer
valeur, mais plutôt avec laSystem.getProperty
méthode.Certes, cela peut être une surprise. Il est malheureux que la bibliothèque ait de telles surprises, mais elle vous apprend une leçon précieuse: recherchez toujours la documentation pour confirmer ce que fait une méthode.
Par coïncidence, une variante de ce problème a été présentée dans Return of the Puzzlers: Schlock and Awe (TS-5186) , Josh Bloch et Neal Gafter's 2009 JavaOne Technical Session présentation. Voici la dernière diapositive:
Pour être complet, il existe également ces méthodes qui sont analogues à
Integer.getInteger
:Boolean.getBoolean(String)
Long.getLong(String)
Questions connexes
Sur l'autounboxing
L'autre problème, bien sûr, est de savoir comment le
NullPointerException
est jeté. Pour nous concentrer sur ce problème, nous pouvons simplifier l'extrait de code comme suit:Voici une citation de Effective Java 2nd Edition, article 49: Préférez les types primitifs aux primitives encadrées:
Il y a des endroits où vous n'avez pas d'autre choix que d'utiliser des primitives encadrées, par exemple des génériques, mais sinon vous devriez sérieusement envisager si une décision d'utiliser des primitives encadrées est justifiée.
Questions connexes
la source
Integer.getInteger(s)
Est donc à peu près équivalent àInteger.parseInt(System.getProperty(s))
? Je pense que je préfère le second, même s'il est plus détaillé, car il met en évidence le fait que vous extrayez des informations des propriétés du système.Integer.decode
place deInteger.parseInt
, qui recherche un début0x
ou0
pour analyser le nombre en hexadécimal ou octal, respectivement.NullPointerException
? : programmers.stackexchange.com/questions/158908/…De http://konigsberg.blogspot.com/2008/04/integergetinteger-are-you-kidding-me.html :
Tu veux ça:
la source
Veuillez consulter la documentation de la méthode getInteger () . Dans cette méthode, le
String
paramètre est une propriété système qui détermine la valeur entière de la propriété système avec le nom spécifié. "123" n'est le nom d'aucune propriété système, comme indiqué ici . Si vous souhaitez convertir cette chaîne enint
, utilisez la méthode commeint num = Integer.parseInt("123")
.la source