我想解析一个包含 8 个十六进制数字(4 字节)的字符串,但我得到了 NumberFormatException。这里有什么问题?
assertThat(Integer.parseInt("FFFF4C6A",16),is(0xFFFF4C6A));
您的数字代表一个大于可分配给 int 的数字。尝试:
Long.parseLong("FFFF4C6A", 16);
这给出了 4294921322。
从文档:
NumberFormatException
如果发生以下任何一种情况,则会引发类型异常:
- 第一个参数为空或长度为零的字符串。
- 基数小于
Character.MIN_RADIX
或大于Character.MAX_RADIX
。- 字符串的任何字符都不是指定基数的数字,...</li>
- 字符串表示的值不是 int 类型的值。
这是您遇到的第四个案例。
那是因为Integer.parseInt("FFFF4C6A",16)
提供的超过了定义为的Integer.MAX_VALUEpublic static final int MAX_VALUE = 0x7fffffff;
现在,根据 parseInt(...) 的Javadoc,您将在以下任一情况下遇到NumberFormatException:
如果发生以下任何一种情况,则会引发NumberFormatException类型的异常:
- 第一个参数为空或长度为零的字符串。
- 基数小于 Character.MIN_RADIX 或大于 Character.MAX_RADIX。
- 字符串的任何字符都不是指定基数的数字,除非第一个字符可以是减号'-'('\u002D')或加号'+'('\u002B'),前提是字符串是长于长度 1。
- 字符串表示的值不是 int 类型的值。
在您的情况下,由于提供的字符串值超过了 Integer.MAX_VALUE,因此您满足NumberFormatException的第 4 个子句
可能的解决方案:为了解析这个,使用Long.parseLong(...)
MAX_VALUE 定义为`public static final long MAX_VALUE = 0x7fffffffffffffffL
如果您只想将该十六进制字符串表示为整数(因为它是 32 位),则需要使用BigInteger
:
new BigInteger("FFFF4C6A", 16).intValue()
您已超出整数范围。
Integer.MAX_VALUE = 2147483647
0xFFFF4C6A = 4294921322
将其解析为Long
作品:
Long.parseLong("FFFF4C6A",16)
我不知道 assertThat() 方法,但是您的十六进制数字“FFFF4C6A”对于整数来说太大了。
例如,如果你写:
int number = Integer.parseInt("FFFF4C6A",16)
你会得到同样的错误。编写代码的正确方法是:
双数 = Integer.parseInt("FFFF4C6A",16)