Question

Lors de l'écriture d'un jeu pour J2ME, nous avons rencontré un problème d'utilisation de java.lang.Integer.parseInt ()

Nous avons plusieurs valeurs constantes définies en tant que valeurs hexadécimales, par exemple:

CHARACTER_RED = 0xFFAAA005;

Pendant le jeu, la valeur est sérialisée et est reçue via une connexion réseau, en tant que représentation sous forme de chaîne de la valeur hexadécimale. Pour le réanalyser dans un entier, nous avons tenté sans succès les opérations suivantes:

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

Ensuite, j'ai fait quelques tests et essayé ceci:

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

Ceci est l'exception du code actuel:

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

Ceci, je dois l'avouer, m'a dérouté. En regardant le code parseInt, l'exception NumberFormatException semble être levée lorsque le nombre analysé "croix" " la " limite négative / positive " (Peut-être que quelqu'un peut éditer dans le bon jargon pour cela?).

S'agit-il du comportement attendu pour la fonction Integer.parseInt? Finalement, j'ai dû écrire ma propre fonction d'analyse syntaxique de chaînes hexadécimales, et l'implémentation fournie m'a déplu.

En d'autres termes, est-ce que je m'attendais à ce qu'Integer.parseInt () fonctionne sur la représentation sous forme de chaîne hexadécimale d'un entier erroné?

EDIT: Dans ma publication initiale, j’avais écrit 0xFFFAAA005 au lieu de 0xFFAAA005. J'ai depuis corrigé cette erreur.

Était-ce utile?

La solution

Le String que vous analysez est trop volumineux pour tenir dans un int . En Java, un int est un type de données signé, 32 bits. Votre chaîne nécessite au moins 36 bits.

Votre valeur (positive) est encore trop grande pour tenir dans un signé int 32 bits.

Autres conseils

Vous rendez-vous compte que votre entrée (4289372165) dépasse la taille maximale d'un int (2147483647)?

Essayez d'analyser la valeur en tant que long et coupez le <> code de la chaîne avant de l'analyser:

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

Je ne suis pas un développeur Java, mais je suppose que parseInt ne fonctionne qu'avec des entiers. 0xFFFAAA005 a 9 chiffres hexadécimaux, donc c'est un long, pas un int. J'imagine que c'est à se plaindre parce que vous lui avez demandé d'analyser un nombre plus gros que le type de données obtenu.

Votre nombre semble trop grand pour tenir dans un int, essayez plutôt Long.parseLong (). De plus, la chaîne ne semble pas être analysée si vous avez 0x dans votre chaîne, alors essayez de la couper.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top