É Integer.parseInt de J2ME () quebrado?
Pergunta
Ao escrever um jogo para J2ME que funcionou em um problema usando java.lang.Integer.parseInt ()
Temos vários valores constantes definidos como valores hexadecimais, por exemplo:
CHARACTER_RED = 0xFFAAA005;
Durante o jogo o valor é serializado e é recebido através de uma conexão de rede, vindo como uma representação de string do valor hexadecimal. A fim de analisá-lo de volta para um int que unsuccesfully tentou o seguinte:
// Response contains the value "ffAAA005" for "characterId"
string hexValue = response.get("characterId");
// The following throws a NumberFormatException
int value = Integer.parseInt(hexValue, 16);
Então eu corri alguns testes e tentei isso:
string hexValue = Integer.toHexString(0xFFAAA005);
// The following throws a NumberFormatException
int value = Integer.parseInt(hexValue, 16);
Esta é a exceção do código real:
java.lang.NumberFormatException: ffaaa005
at java.lang.Integer.parseInt(Integer.java:462)
at net.triadgames.acertijo.GameMIDlet.startMIDlet(GameMIDlet.java:109)
Esta Eu devo admitir, me perplexo. Olhando para o código parseInt o NumberFormatException parece ser acionada quando o número que está sendo analisado "cruzes" o "negativo / positivo limite" (talvez alguém pode editar no jargão certo para isso?).
Este é o comportamento esperado para a função Integer.parseInt? No final, eu tinha que escrever minha própria função análise de cadeia hex, e eu estava bastante descontente com a implementação fornecido.
Em outras palavras, era a minha expectativa de ter Integer.parseInt de trabalho () sobre a representação string hexadecimal de um inteiro equivocada?
EDIT: Na minha postagem inicial escrevi 0xFFFAAA005 vez de 0xFFAAA005. Eu já corrigido esse erro.
Solução
O String
você estiver analisando é muito grande para caber em uma int
. Em Java, um int
é um tipo de dados assinados, 32-bit. Sua seqüência requer pelo menos 36 bits.
O seu valor (positivo) ainda é muito grande para caber em um assinado 32-bit int
.
Outras dicas
percebem que sua entrada (4289372165) excede o tamanho máximo de um int
(2147483647)?
Tente analisar o valor como um long
e aparar o "0x"
dando início a corda antes de analisá-lo:
public class Program {
public static void main(String[] args) {
String input = "0xFFFAAA005";
long value = Long.parseLong(input.substring(2), 16);
System.out.print(value);
}
}
Eu não sou um dev java, mas eu acho que parseInt só funciona com números inteiros. 0xFFFAAA005 tem 9 dígitos hexadecimais, por isso é um longo, e não um int. Meu palpite é que está reclamando porque você pediu para analisar um número que é maior do que seu tipo de dados de resultado.
O número parece ser grande demais para caber em um int, tente usar Long.parseLong () em vez. Além disso, a seqüência parece não ter analisado se você tem 0x na cadeia, de modo a tentar cortar isso fora.