我有一个变量类型int,我必须分配负数:-2147483648,问题是我试图使用valueOf()方法将其转换为十六进制形式,当我尝试这个:
Integer.valueOf(String.valueOf(n),16);
n是负数
它抛出异常java.lang.NumberFormatException:对于输入字符串:-214748 ....
为什么我得到这个?
答案 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的整数。问题是这两个约束中恰好有一个不成立:
检查这些约束正是Integer.parseInt(String, int)
为您所做的事情。如果你检查Integer.parseInt(String, int)
的源代码,那么你会注意到这段代码抛出了异常:
if (result < multmin) {
throw NumberFormatException.forInputString(s);
}
其中result
是中间结果,而解析正在从字符串的开头到结尾进行,而multmin
是Integer.MAX_VALUE / radix
或-Integer.MAX_VALUE / radix
。 (仅添加负面影响的原因是abs(Integer.MIN_VALUE)
&gt; abs(Integer.MAX_VALUE)
)。
正在进行解析并检测到,如果要处理的其他字符至少还有一个,则必须违反其中一个约束。这就是抛出异常的地方:它表示你已经为这个方法提供了一个无法接受的参数。