Frage

Während ein Spiel für J2ME Schreiben liefen wir in ein Problem mit java.lang.Integer.parseInt ()

Wir haben mehrere konstante Werte als Hex-Werte definiert, zum Beispiel:

CHARACTER_RED = 0xFFAAA005;

Während des Spiels wird der Wert serialisiert und über eine Netzwerkverbindung empfangen wird, als eine String-Darstellung des Hex-Wert kommen in. Um es in einen int zu analysieren zurück wir versuchen unsuccesfully folgend:

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

Dann lief ich ein paar Tests und versucht, dies:

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

Das ist die Ausnahme von dem eigentlichen Code:

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

Das muss ich zugeben, verblüfft mich. Mit Blick auf dem parseInt Code scheint die Number geworfen zu werden, wenn die Zahl „Kreuze“, die „Negativ / Positiv-Grenze“ analysiert werden (vielleicht jemand in dem rechten Jargon für diese bearbeiten kann?).

Ist dies das erwartete Verhalten für die Integer.parseInt Funktion? Am Ende hatte ich meine eigene Hex-String-Parsing-Funktion zu schreiben, und ich war sehr unzufrieden mit der vorgesehenen Umsetzung.

Mit anderen Worten, war meine Erwartung mit Integer.parseInt () Arbeiten an der Hex-String-Darstellung einer ganzen Zahl fehlgeleitet?

EDIT: In meinem ersten Posting schrieb ich 0xFFFAAA005 statt 0xFFAAA005. Ich habe diesen Fehler seit korrigiert.

War es hilfreich?

Lösung

Die String Sie Parsen ist eine zu große int zu passen. In Java ist ein int ein signierten 32-Bit-Datentyp. Ihre Zeichenfolge erfordert mindestens 36 Bits.


Ihr (positiver) Wert ist immer noch zu groß ein unterzeichnet 32-Bit-int zu passen.

Andere Tipps

Sie erkennen, dass Ihre Eingabe (4289372165) überläuft die maximale Größe eines int (2147483647)?

Versuchen Sie den Wert als long Parsen und schneiden Sie die führenden "0x" aus der Zeichenfolge, bevor Sie es analysieren:

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

Ich bin kein Java-Entwickler, aber ich würde vermuten, parseInt nur mit ganzen Zahlen arbeitet. 0xFFFAAA005 hat 9 hexadezimale Ziffern, also ist es ein langes, nicht ein int. Meine Vermutung ist, es beschwert sich, weil Sie es aufgefordert, eine Nummer zu analysieren, die größer ist, als es Ergebnisdatentyp ist.

Ihre Zahl scheint in einem int zu sein, zu groß zu passen, versucht Long.parseLong mit () statt. Auch dann, wenn die Zeichenfolge nicht zu erhalten analysiert scheinen, wenn Sie 0x in der Zeichenfolge haben, so versuchen, dass der Weg abzuschneiden.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top