簡體   English   中英

將十六進制字符串解析為int值時發生意外的NumberFormatException

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM