我想解析一个包含8个十六进制数字(4字节)的字符串,但我得到了一个NumberFormatException。这有什么不对?
assertThat(Integer.parseInt("FFFF4C6A",16),is(0xFFFF4C6A));
答案 0 :(得分:3)
您的数字代表的数字大于可分配给int的数字。尝试:
Long.parseLong("FFFF4C6A", 16);
,它给出了4294921322。
来自doc:
如果出现以下任何一种情况,则抛出类型
NumberFormatException
的异常:
- 第一个参数为null或是一个长度为零的字符串。
- 基数小于
Character.MIN_RADIX
或大于Character.MAX_RADIX
。- 字符串的任何字符都不是指定基数的数字,...
- 字符串表示的值不是int类型的值。
这是你遇到的第四个案例。
答案 1 :(得分:2)
这是因为提供的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
答案 2 :(得分:1)
您已超出整数范围。
Integer.MAX_VALUE = 2147483647
0xFFFF4C6A = 4294921322
将其解析为Long
有效:
Long.parseLong("FFFF4C6A",16)
答案 3 :(得分:1)
如果您只想将十六进制字符串表示为整数(因为它是32位),则需要使用BigInteger
:
new BigInteger("FFFF4C6A", 16).intValue()
答案 4 :(得分:0)
我不知道assertThat()方法,但是你的十六进制数" FFFF4C6A"是一个大整数。
例如,如果你写:
int number = Integer.parseInt(" FFFF4C6A",16)
你会得到同样的错误。 编写代码的正确方法是:
double number = Integer.parseInt(" FFFF4C6A",16)