Domanda

Durante la scrittura di un gioco per J2ME abbiamo riscontrato un problema utilizzando java.lang.Integer.parseInt ()

Abbiamo diversi valori costanti definiti come valori esadecimali, ad esempio:

CHARACTER_RED = 0xFFAAA005;

Durante il gioco il valore è serializzato e viene ricevuto attraverso una connessione di rete, arrivando come una rappresentazione di stringa del valore esadecimale. Per analizzarlo nuovamente in un int, abbiamo tentato senza successo quanto segue:

// Response contains the value "ffAAA005" for "characterId"
string hexValue = response.get("characterId");
// The following throws a NumberFormatException
int value = Integer.parseInt(hexValue, 16);

Quindi ho eseguito alcuni test e ho provato questo:

string hexValue = Integer.toHexString(0xFFAAA005);
// The following throws a NumberFormatException
int value = Integer.parseInt(hexValue, 16);

Questa è l'eccezione dal codice attuale:

java.lang.NumberFormatException: ffaaa005
    at java.lang.Integer.parseInt(Integer.java:462)
    at net.triadgames.acertijo.GameMIDlet.startMIDlet(GameMIDlet.java:109)

Questo, devo ammetterlo, mi ha sconcertato. Guardando il codice parseInt, NumberFormatException sembra essere lanciato quando il numero in fase di analisi "incrocia" " il "limite negativo / positivo" (forse qualcuno può modificare il gergo giusto per questo?).

È questo il comportamento previsto per la funzione Integer.parseInt? Alla fine ho dovuto scrivere la mia funzione di analisi delle stringhe esadecimali e non ero molto soddisfatto dell'implementazione fornita.

In altre parole, la mia aspettativa di avere Integer.parseInt () funzionava sulla rappresentazione della stringa esadecimale di un numero intero errata?

EDIT: nel mio post iniziale ho scritto 0xFFFAAA005 invece di 0xFFAAA005. Da allora ho corretto quell'errore.

È stato utile?

Soluzione

La String che stai analizzando è troppo grande per stare in un int . In Java, un int è un tipo di dati a 32 bit con segno. La tua stringa richiede almeno 36 bit.


Il tuo valore (positivo) è ancora troppo grande per essere inserito in un int int a 32 bit

.

Altri suggerimenti

Ti rendi conto che il tuo input (4289372165) supera la dimensione massima di un int (2147483647)?

Prova ad analizzare il valore come long e ritaglia il " 0x " principale dalla stringa prima di analizzarlo:

public class Program {
    public static void main(String[] args) {
        String input = "0xFFFAAA005";
        long value = Long.parseLong(input.substring(2), 16);
        System.out.print(value);
    }
}

Non sono uno sviluppatore Java, ma immagino che parseInt funzioni solo con numeri interi. 0xFFFAAA005 ha 9 cifre esadecimali, quindi è lunga, non int. La mia ipotesi è che si stia lamentando perché gli hai chiesto di analizzare un numero più grande del tipo di dati dei risultati.

Il tuo numero sembra essere troppo grande per rientrare in un int, prova invece a utilizzare Long.parseLong (). Inoltre, la stringa non sembra essere analizzata se hai 0x nella stringa, quindi prova a tagliarla.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top