2009-04-30 12 views
2

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

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

CHARACTER_RED = 0xFFAAA005; 

Während des Spiels Der Wert wird serialisiert und über eine Netzwerkverbindung empfangen, die als Zeichenfolgendarstellung des Hexadezimalwerts angezeigt wird. 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 versuchte, dies:

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

Dies 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. Wenn man den parseInt-Code betrachtet, scheint die NumberFormatException ausgelöst zu werden, wenn die zu analysierende Zahl die "negative/positive Grenze" überschreitet (vielleicht kann jemand dafür im rechten Jargon editieren).

Ist dies das erwartete Verhalten für die Integer.parseInt-Funktion? Am Ende musste ich meine eigene Hex-String-Parsing-Funktion schreiben, und ich war ziemlich unzufrieden mit der bereitgestellten Implementierung.

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

EDIT: In meiner ersten Veröffentlichung schrieb ich 0xFFFAAA005 anstelle von 0xFFAAA005. Seitdem habe ich diesen Fehler korrigiert.

+0

Es ist eine schlechte Idee anzunehmen, dass das von Ihnen verwendete weit verbreitete Tool einen so grundlegenden Fehler hat. Wann immer Sie versucht sind, davon auszugehen, sollten Sie doppelt und dreifach prüfen, ob Sie alles richtig machen. –

+0

Ich bekomme die Downvotes nicht wirklich. Es war eine gut geschriebene Frage. –

+0

+1 Ich bin nicht sicher, warum dies abgelehnt wurde - es ist eine legitime Frage. –

Antwort

6

Die String Sie analysieren ist zu groß, um in eine int passen. In Java ist ein int ein signierter 32-Bit-Datentyp. Ihre Zeichenfolge benötigt mindestens 36 Bit.


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

+0

Mein Fehler beim Schreiben der Frage, das Verhalten passiert immer noch mit 0xFFaaa005, das ist der Wert, den wir im Code verwenden. –

+1

http://bugs.sun.com/view_bug.do?bug_id=4068580 – kdgregory

+0

"Wenn Sie einen negativen Wert analysieren, wird es funktionieren:" -FFAAA005 "", nein, das funktioniert auch nicht. Das wird auch bei einem 32-Bit-int-Zeichen mit Überlauf auftreten. –

1

Ich bin kein Java-Entwickler, aber ich denke, ParseInt funktioniert nur mit Ganzzahlen. 0xFFFAAA005 hat 9 Hexadezimalziffern, also ist es ein langer, kein int. Meine Vermutung ist, dass es sich beschwert, weil Sie es gebeten haben, eine Zahl zu analysieren, die größer als sein Ergebnis ist.

+0

Danke, repariere es in der Frage. Der tatsächliche Codewert ist 0xFFAAA005, nicht der 0xFFFAAA005, der ursprünglich in der Frage aufgeführt wurde. –

4

Wissen Sie, dass Ihre Eingabe (4289372165) die maximale Größe einer int (2147483647) überschreitet?

Versuchen Sie den Wert als long und schneiden Sie die führende "0x" aus dem String-Parsing, 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); 
    } 
} 
+0

Bitte schauen Sie sich die bearbeitete Version an. Danke, dass du diesen Fehler in meinem ursprünglichen Beitrag der Frage aufgezeigt hast. –

+0

Ihre Eingabe (auch nach der Korrektur) ist immer noch zu groß für einen Int. –

0

Ihre Nummer zu groß zu sein scheint, in einen int zu passen, versuchen Long.parseLong mit () stattdessen. Auch die Zeichenfolge scheint nicht geparst zu werden, wenn Sie 0x in Ihrer Zeichenfolge haben, also versuchen Sie, diese abschneiden.

+0

Danke. Ich habe seitdem das Problem behoben, Dinge aus dem Speicher zu schreiben, anstatt den eigentlichen Code zu betrachten. –