3

J2ME 用のゲームを作成しているときに、java.lang.Integer.parseInt() を使用して問題に遭遇しました。

16 進値として定義されたいくつかの定数値があります。たとえば、次のようになります。

CHARACTER_RED = 0xFFAAA005;

ゲーム中、値はシリアル化され、ネットワーク接続を介して受信され、16 進値の文字列表現として受信されます。それを解析して int に戻すために、次のことを試みましたが失敗しました。

// 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() が整数の 16 進文字列表現で機能するという私の期待は見当違いでしたか?

編集: 最初の投稿では、0xFFAAA005 の代わりに 0xFFFAAA005 を書きました。それ以来、私はその間違いを修正しました。

4

4 に答える 4

6

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


あなたの(正の)値はまだ大きすぎて、符号付きの32 ビットに収まりませんint

于 2009-04-30T18:01:52.300 に答える
4

入力 (4289372165) がint(2147483647) の最大サイズをオーバーフローしていることに気付きましたか?

値を a として解析し、解析する前に文字列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);
    }
}
于 2009-04-30T18:02:28.677 に答える
1

私はJava開発者ではありませんが、parseIntは整数でのみ機能すると思います。0xFFFAAA005 は 9 桁の 16 進数なので、int ではなく long です。結果のデータ型よりも大きい数値を解析するように要求したため、不平を言っていると思います。

于 2009-04-30T18:02:26.087 に答える
0

数値が大きすぎて int に収まらないようです。代わりに Long.parseLong() を使用してみてください。また、文字列に 0x があると文字列が解析されないように見えるので、それを切り捨ててみてください。

于 2009-04-30T18:05:09.327 に答える