使用 valueOf() 方法转换为十六进制形式



我有一个变量类型int,我必须分配负数:-2147483648,问题是我正在尝试使用valueOf()方法将其转换为十六进制形式,当我尝试这样做时:

Integer.valueOf(String.valueOf(n),16); n 是负数

它抛给我异常java.lang.NumberFormatException:对于输入字符串:-214748...。

为什么我会得到这个??

改用 Integer.toString(n, 16) 来获取 n 的十六进制表示形式。

问题的简短解释。问题是使用

Integer.valueOf(String.valueOf(n),16);

您假设 -2147483648 是十六进制形式的整数(您正在解析以 16 为基数的 -2147483648),并且它比 Interger.MIN_VALUE 小得多,因此会导致异常。正如@Jean建议的那样,请改用Integer.toString(int i, radix)

从文档:

如果发生以下任何情况,则会引发类型为 NumberFormatException 的异常:

  • 字符串表示的值不是 int 类型的值。

这是因为Integer.valueOf(String, int)解析您的 String 参数,就好像它是一个基数为 16 的整数一样。问题是这两个约束中的一个并不成立:

  • 字符串参数(基数 16)> 整数.MAX_值(基数 2),或
  • 字符串参数(基数 16)

检查这些约束正是Integer.parseInt(String, int)为您所做的。如果您检查 Integer.parseInt(String, int) 的源代码,那么您会注意到这段代码抛出了异常:

if (result < multmin) {
    throw NumberFormatException.forInputString(s);
}

其中result是从字符串的开头到结尾进行解析时的中间结果,multminInteger.MAX_VALUE / radix-Integer.MAX_VALUE / radix。(只添加负数的原因是abs(Integer.MIN_VALUE)> abs(Integer.MAX_VALUE))。

分析正在进行中,并检测到如果至少还有一个附加字符要处理,则必须违反其中一个约束。这就是将引发异常的地方:它表示您已向此方法提供了无法接受的参数。

最新更新