O seguinte código gera NullPointerException
:
int num = Integer.getInteger("123");
Meu compilador está invocando getInteger
em null, pois é estático? Isso não faz sentido!
O que está acontecendo?
java
integer
nullpointerexception
api-design
autoboxing
user282886
fonte
fonte
Respostas:
A grande imagem
Existem dois problemas em jogo aqui:
Integer getInteger(String)
não faz o que você pensa que faznull
neste casoInteger
paraint
causa o desempacotamento automáticoInteger
énull
,NullPointerException
é lançadoPara analisar
(String) "123"
a(int) 123
, você pode usar por exemploint Integer.parseInt(String)
.Referências
Integer
Referências APIstatic int parseInt(String)
static Integer getInteger(String)
Em
Integer.getInteger
Aqui está o que a documentação tem a dizer sobre o que esse método faz:
Em outras palavras, esse método não tem nada a ver com a análise de a
String
para umint/Integer
valor, mas sim com oSystem.getProperty
método.É certo que isso pode ser uma grande surpresa. É uma pena que a biblioteca tenha surpresas como essa, mas ela ensina uma lição valiosa: sempre consulte a documentação para confirmar o que um método faz.
Coincidentemente, uma variação desse problema foi apresentada em Return of the Puzzlers: Schlock and Awe (TS-5186) , apresentação de Josh Bloch e Neal Gafter na Sessão Técnica JavaOne 2009. Aqui está o slide de conclusão:
Para completar, também existem estes métodos que são análogos a
Integer.getInteger
:Boolean.getBoolean(String)
Long.getLong(String)
Perguntas relacionadas
No autounboxing
A outra questão, claro, é como isso
NullPointerException
é jogado. Para focar neste problema, podemos simplificar o snippet da seguinte maneira:Aqui está uma citação do Effective Java 2nd Edition, Item 49: Prefira tipos primitivos a primitivos em caixa:
Há lugares onde você não tem escolha a não ser usar primitivos in a box, por exemplo, genéricos, mas caso contrário, você deve considerar seriamente se a decisão de usar primitivos in a box é justificada.
Perguntas relacionadas
fonte
Integer.getInteger(s)
é mais ou menos equivalente aInteger.parseInt(System.getProperty(s))
? Acho que prefiro o segundo, embora seja mais detalhado, porque destaca o fato de que você está extraindo informações das propriedades do sistema.Integer.decode
vez deInteger.parseInt
, que procura um líder0x
ou0
para analisar o número como hexadecimal ou octal, respectivamente.NullPointerException
? : programmers.stackexchange.com/questions/158908/…De http://konigsberg.blogspot.com/2008/04/integergetinteger-are-you-kidding-me.html :
Você quer isso:
fonte
Verifique a documentação do método getInteger () . Neste método, o
String
parâmetro é uma propriedade do sistema que determina o valor inteiro da propriedade do sistema com o nome especificado. "123" não é o nome de nenhuma propriedade do sistema, conforme discutido aqui . Se você deseja converter esta String paraint
, use o método comoint num = Integer.parseInt("123")
.fonte