在为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。我已经纠正了这个错误。

有帮助吗?

解决方案

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


您的(正)值仍然太大,无法容纳签名的 32位 int

其他提示

是否意识到您的输入(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);
    }
}

我不是java开发人员,但我猜parseInt只适用于整数。 0xFFFAAA005有9个十六进制数字,所以它是一个长整数,而不是一个整数。我的猜测是抱怨,因为你要求它解析一个比它的结果数据类型更大的数字。

您的号码似乎太大而无法放入int中,请尝试使用Long.parseLong()。 此外,如果您的字符串中包含0x,则字符串似乎不会被解析,因此请尝试将其删除。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top