2009-04-30 93 views
2

在写一个游戏,J2ME,我们遇到了一个问题,使用java.lang.Integer.parseInt()J2ME的Integer.parseInt()是否被破坏?

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

CHARACTER_RED = 0xFFAAA005; 

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

换句话说,我期望Integer.parseInt()对错误导出的整数的十六进制字符串表示有效吗?

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

+0

假设您使用的广泛使用的工具有这样一个基本错误,这是一个坏主意。每当你想要假设,你应该双重和三重地检查你是否做得正确。 – 2009-04-30 18:06:40

+0

我并没有真正得到赞扬。这是一个写得很好的问题。 – 2009-04-30 18:07:52

+0

+1我不知道为什么这是downvoted - 这是一个合法的问题。 – 2009-04-30 18:08:23

回答

6

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


你(正)值仍然过大,以适应在签署 32位int

+0

编写问题时出现错误,行为仍然发生在0xFFaaa005这是我们在代码中使用的值。 – 2009-04-30 18:23:38

1

我不是一个java dev,但我猜parseInt只能用整数。 0xFFFAAA005有9个十六进制数字,所以它很长,而不是一个int。我的猜测是它抱怨,因为你让它解析一个比它的结果数据类型更大的数字。

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

您的号码似乎太大,适合用int,尝试使用的Long.parseLong( )代替。 另外,如果字符串中有0x,那么字符串似乎不会被解析,所以试着将其关闭。