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

时间:2015-01-20 15:46:54

标签: java

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

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

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

为什么我得到这个?

3 个答案:

答案 0 :(得分:3)

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

答案 1 :(得分:2)

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

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

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

来自文档:

  

如果发生以下任何一种情况,则抛出NumberFormatException类型的异常:

     
      
  • ...

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

  •   

答案 2 :(得分:0)

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

  • String参数(基数16)> Integer.MAX_VALUE(基数2)或
  • String参数(基数16)< Integer.MIN_VALUE(base 2)

检查这些约束正是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)&gt; abs(Integer.MAX_VALUE))。

正在进行解析并检测到,如果要处理的其他字符至少还有一个,则必须违反其中一个约束。这就是抛出异常的地方:它表示你已经为这个方法提供了一个无法接受的参数。