3

在为 J2ME 编写游戏时,我们遇到了使用 java.lang.Integer.parseInt() 的问题

我们有几个常量值定义为十六进制值,例如:

CHARACTER_RED = 0xFFAAA005;

在游戏过程中,该值被序列化并通过网络连接接收,以十六进制值的字符串表示形式出现。为了将其解析回 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 函数的预期行为吗?最后我不得不编写自己的十六进制字符串解析函数,我对提供的实现非常不满意。

换句话说,我期望 Integer.parseInt() 在整数的十六进制字符串表示上工作被误导了吗?

编辑:在我最初的帖子中,我写了 0xFFFAAA005 而不是 0xFFAAA005。我已经纠正了这个错误。

4

4 回答 4

6

String您正在解析的文件太大而无法放入int. 在 Java 中,anint是有符号的 32 位数据类型。您的字符串至少需要 36 位。


您的(正)值仍然太大而无法放入有符号的32-bitint中。

于 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 个十六进制数字,所以它是一个长整数,而不是整数。我的猜测是它在抱怨,因为您要求它解析一个大于结果数据类型的数字。

于 2009-04-30T18:02:26.087 回答
0

您的数字似乎太大而无法放入 int,请尝试改用 Long.parseLong()。此外,如果您的字符串中有 0x,则该字符串似乎不会被解析,因此请尝试将其切断。

于 2009-04-30T18:05:09.327 回答