2013-09-01 47 views
0

當我將多個十六進制字符插入正在轉換爲整數值的字符串時,我收到了異常。NumberFormatException對很多十六進制字符

代碼:

//variables used in this problem 
int INT_MAX = 2147483647; 
int INT_MIN = -2147483648; 
int currentBase = 16; 
string displayValue; 

switch(currentBase) { 
    case 16: 
     if((Integer.valueOf(displayValue + "F", currentBase) >= INT_MIN) && (Integer.valueOf(displayValue + "F", currentBase) <= INT_MAX)) 
     { 
      displayValue += "F"; 
     } 
     break; 
} 

錯誤消息:

E/AndroidRuntime(6944): Caused by: java.lang.NumberFormatException: Invalid int: "FFFFFFFF" 
E/AndroidRuntime(6944):  at java.lang.Integer.invalidInt(Integer.java:138) 
E/AndroidRuntime(6944):  at java.lang.Integer.parse(Integer.java:378) 
E/AndroidRuntime(6944):  at java.lang.Integer.parseInt(Integer.java:366) 
E/AndroidRuntime(6944):  at java.lang.Integer.valueOf(Integer.java:510) 
E/AndroidRuntime(6944):  at com.example.calculator.MainActivity.send_f(MainActivity.java:968) 

我需要這個字符串具有不超過尺寸INT(32個比特)大的值。有什麼建議麼?

+2

讓您的數字小嗎?你在問什麼? – SLaks

+0

該數字是用戶輸入,我試圖在支持雙字(32位)的計算器中使用此值。 – Taylor

+0

正如您似乎已經知道的那樣,Java'int'值範圍從-2147483648到2147483647.十六進制值0xFFFFFFFF是4294967295,它在此範圍之外。 –

回答

0

Greg Hewgill的評論是正確的。它看起來像你試圖讓位自動解釋。可能最簡單的事情就是像

Long.valueOf(displayValue + "F", currentBase).intValue(); 

得到的位,然後將它們截斷爲int。當然,現在您有責任確保Long.valueOf的參數符合32位。

+0

謝謝!我掌握了一切工作,現在對這些轉換的工作有了更好的理解! – Taylor

0
try { 
    // try your calculation here 
} catch (NumberFormatException e) { 
    // assign the variable the max/min value instead 
    // or whatever behavior you want 
} 

此代碼將爲超出範圍的數字提供默認行爲。

0

在我看來,你使用了錯誤的方法十六進制字符串爲int的轉換,如果我這個理解是錯誤的,讓我知道

我引用一個重複的職位

String hex = "ff" 

// small values 
    int value = Integer.parseInt(hex, 16); 

// big values 
    BigInteger value = new BigInteger(hex, 16); 

refer for the duplicate post i quoted

API refrence for the method

1

FFFFFFFF太大,最大int值是在爲0x7FFFFFFF解決方法是

int i = (int)Long.parseLong(hexStr, 16); 
+0

謝謝,我明白0x7FFFFFFFF是最大的int值。我將如何採取0xFFFFFFFF並獲得-1的int值? – Taylor

+0

(int)Long.parseLong(「FFFFFFFFF」,16)給出-1,嘗試 –

相關問題