2009-04-30 92 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,那麼字符串似乎不會被解析,所以試着將其關閉。