É Integer.parseInt de J2ME () quebrado?

votos
2

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 tentei 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)

Isso 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 de contorno / positiva (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.

Publicado 30/04/2009 em 18:58
fonte usuário
Em outras línguas...                            


4 respostas

votos
6

O Stringque você está 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.


Seu valor (positivo) ainda é muito grande para caber em um assinado 32-bit int.

Respondeu 30/04/2009 em 19:01
fonte usuário

votos
4

Você percebe que sua entrada (4289372165) excede o tamanho máximo de um int(2147483647)?

Tente analisar o valor como um longe aparar o líder "0x"fora da 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);
    }
}
Respondeu 30/04/2009 em 19:02
fonte usuário

votos
1

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.

Respondeu 30/04/2009 em 19:02
fonte usuário

votos
0

Seu 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.

Respondeu 30/04/2009 em 19:05
fonte usuário

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more