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.

Foi útil?

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.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top