J2ME的Integer.parseInt()坏了吗?
题
在为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,则字符串似乎不会被解析,因此请尝试将其删除。