[英]Unexpected NumberFormatException while parsing a hex string to an int value
我想解析一個包含8個十六進制數字(4字節)的字符串,但是我遇到了NumberFormatException。 怎么了
assertThat(Integer.parseInt("FFFF4C6A",16),is(0xFFFF4C6A));
您的數字代表的數字大於可分配給int的數字。 嘗試:
Long.parseLong("FFFF4C6A", 16);
得到4294921322。
從文檔 :
如果發生以下任一情況,將引發
NumberFormatException
類型的異常:
- 第一個參數為null或長度為零的字符串。
- 基數小於
Character.MIN_RADIX
或大於Character.MAX_RADIX
。- 字符串的任何字符都不是指定基數的數字,…
- 字符串表示的值不是int類型的值。
這是您遇到的第四個案例。
這是因為提供的Integer.parseInt("FFFF4C6A",16)
超出了Integer.MAX_VALUE ,后者被定義為public static final int MAX_VALUE = 0x7fffffff;
現在,根據parseInt(...)的Javadoc ,在以下兩種情況下,您都將遇到NumberFormatException :
如果發生以下任一情況,將引發NumberFormatException類型的異常:
- 第一個參數為null或長度為零的字符串。
- 基數小於Character.MIN_RADIX或大於Character.MAX_RADIX。
- 字符串的任何字符都不是指定基數的數字,除非第一個字符可以是減號'-'('\\ u002D')或加號'+'('\\ u002B')(前提是該字符串是長於長度1。
- 字符串表示的值不是int類型的值。
在您的情況下,由於提供的String值超過Integer.MAX_VALUE,因此您滿足NumberFormatException的第4個子句
可能的解決方案:為了對此進行解析,請使用Long.parseLong(...)
,其中MAX_VALUE定義為`public static final long MAX_VALUE = 0x7fffffffffffffffL
您已超出整數范圍。
Integer.MAX_VALUE = 2147483647
0xFFFF4C6A = 4294921322
將其解析為Long
作品:
Long.parseLong("FFFF4C6A",16)
如果僅要將十六進制字符串表示為整數(因為它是32位),則需要使用BigInteger
:
new BigInteger("FFFF4C6A", 16).intValue()
我不知道assertThat()方法,但是您的十六進制數字“ FFFF4C6A”對於一個整數來說太大了。
例如,如果您編寫:
int號= Integer.parseInt(“ FFFF4C6A”,16)
您將得到相同的錯誤。 編寫代碼的正確方法是:
雙精度數= Integer.parseInt(“ FFFF4C6A”,16)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.