【发布时间】:2012-09-13 09:25:41
【问题描述】:
我想解析一个包含 8 个十六进制数字(4 个字节)的字符串,但我得到了一个 NumberFormatException。这里有什么问题?
assertThat(Integer.parseInt("FFFF4C6A",16),is(0xFFFF4C6A));
【问题讨论】:
我想解析一个包含 8 个十六进制数字(4 个字节)的字符串,但我得到了一个 NumberFormatException。这里有什么问题?
assertThat(Integer.parseInt("FFFF4C6A",16),is(0xFFFF4C6A));
【问题讨论】:
您的数字代表一个大于可分配给 int 的数字。试试:
Long.parseLong("FFFF4C6A", 16);
给出 4294921322。
来自doc:
如果出现以下任何一种情况,则会抛出
NumberFormatException类型的异常:
- 第一个参数为空或长度为零的字符串。
- 基数要么小于
Character.MIN_RADIX,要么大于Character.MAX_RADIX。- 字符串的任何字符都不是指定基数的数字,...
- 字符串表示的值不是int类型的值。
这是您遇到的第 4 个案例。
【讨论】:
这是因为提供的Integer.parseInt("FFFF4C6A",16) 超过了Integer.MAX_VALUE 定义为public 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
【讨论】:
您已超出整数范围。
Integer.MAX_VALUE = 2147483647
0xFFFF4C6A = 4294921322
将其解析为 Long 有效:
Long.parseLong("FFFF4C6A",16)
【讨论】:
Character.MAX_RADIX 更好地表达了 OP 的意图
如果你只想将那个十六进制字符串表示为一个整数(因为它是 32 位),你需要使用BigInteger:
new BigInteger("FFFF4C6A", 16).intValue()
【讨论】:
我不知道 assertThat() 方法,但是你的十六进制数“FFFF4C6A”对于整数来说太大了。
例如,如果你写:
int number = Integer.parseInt("FFFF4C6A",16)
你会得到同样的错误。 编写代码的正确方法是:
双数 = Integer.parseInt("FFFF4C6A",16)
【讨论】: