2009-04-30 2 views
2

我々はjava.lang.Integer.parseIntを使用して問題に遭遇した()J2MEのInteger.parseInt()は壊れていますか? J2MEのためのゲームを書いている間

私たちは、例えば、六角形の値として定義されているいくつかの定数値が設定されていますゲーム中

CHARACTER_RED = 0xFFAAA005; 

値はシリアライズされ、ネットワーク接続を介して受信され、16進値の文字列表現として入力されます。バックint型にそれを解析するために、我々はunsuccesfully以下を試してみました:

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

は、その後、私はいくつかのテストを実行し、この試みた:

:これは、実際のコードから例外では

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

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

私はこのことを認めなければなりません。 parseIntコードを見ると、解析対象の数値が「否定的/肯定的な境界」を「横切る」ときにNumberFormatExceptionがスローされているように見えます。

これはInteger.parseInt関数の予想される動作ですか?最後に、独自の16進文字列解析関数を記述しなければなりませんでした。提供された実装にはかなり不快でした。

言い換えれば、Integer.parseInt()が整数の誤った文字列表現に間違って動作することを期待していましたか?

編集:私の最初の投稿では、0xFFAAA005ではなく0xFFFAAA005を書きました。私はそれ以来、間違いを訂正しました。

+0

広く使用されているツールがこのような基本的なバグを持っていると仮定するのは悪い考えです。あなたがそのことを推測したくなるときはいつでも、すべてのことを正しくやっていることを二重と三重にチェックするべきです。 –

+0

私は本当にダウンボントを得ていません。それはよく書かれた質問だった。 –

+0

+1なぜこれが下落したのか分かりません - それは正当な質問です。 –

答えて

6

解析中のStringが大きすぎて、intに収まりません。 Javaでは、intは符号付きの32ビットデータ型です。文字列には少なくとも36ビットが必要です。


あなたの(正の)値はまだに収まるには大きすぎる 32ビットintに署名しました。

+0

質問を書いたときの私の間違いは、コード内で使用している値である0xFFaaa005で動作します。 –

+1

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

+0

"負の値を解析すると、" -FFAAA005 ""のいずれかが機能しません。それはまた、符号付き32ビット整数のためにオーバーフローします。 –

1

私はjava開発者ではありませんが、私はparseIntが整数でのみ動作すると思います。 0xFFFAAA005は9桁の16進数を持っているので、intではなく長いです。私の推測では、結果のデータ型よりも大きな数値を解析するように頼んだので、不平を言っています。

+0

ありがとう、質問にそれを修正しました。実際のコード値は0xFFAAA005で、私が最初に質問に挙げた0xFFFAAA005ではありません。 –

4

入力(4289372165)がint(2147483647)の最大サイズをオーバーフローすることを認識していますか?

longとして値を解析してみて、あなたはそれを解析する前に、文字列をオフリードする "0x"トリム:

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

編集したバージョンを見てください。質問の私の元の投稿の間違いを指摘してくれてありがとう。 –

+0

あなたの入力は(修正後であっても)intのためには大きすぎます。 –

0

あなたの数は、Long.parseLongを使用してみてくださいint型に収まるように大きすぎるように思わ( )代わりに。 また、文字列に0xがある場合、文字列は解析されないように見えるので、それをカットしてみてください。

+0

ありがとうございます。私はそれ以来、実際のコードを見るのではなく、メモリから物を書くという問題を修正しました。 –

関連する問題