我得到一个错误,因为下面的代码行:
int x = color(Integer.parseInt("ffffffde",16));
字符串
值“ffffffde”由以下代码创建:
Integer.toHexString(int_val);
型
错误代码:
Exception in thread "Animation Thread" java.lang.NumberFormatException: For input string: "ffffffde"
at java.lang.NumberFormatException.forInputString(Unknown Source)
at java.lang.Integer.parseInt(Unknown Source)
型
我认为这可能是因为它是一个负值。
你知道为什么或者怎么修吗?
编辑:
原来这是Java 8之前版本中的一个已知bug JDK-4215269。
虽然可以将整数转换为十六进制字符串,但如果它们是负数,则无法将它们转换回来!
3条答案
按热度按时间hivapdat1#
ffffffde
大于整数最大值Java int is 32 bit有符号类型的范围是从-2,147,483,648到2,147,483,647。
字符串
编辑
您使用
Integer.toHexString(int_val)
将int转换为十六进制字符串。从该方法的文档中:返回整数参数的字符串表示形式,表示为以16为底的无符号整数。
但是
int
是一个signed类型。使用
型
将其作为负值返回。
zf2sa74q2#
如果你得到这样的错误,
字符串
那么你传递的值ffffffde就有问题了。这不是一个有效的十六进制值,无法解析为int。
请试试这个
型
应该能用
对于超过16进制的值,您必须解析为Long
型
这也应该可以
zi8p0yeb3#
使用Java 8中引入的
Integer.parseUnsignedInt
方法而不是Integer.parseInt
将产生所需的行为。字符串
问题是
Integer.toHexString
返回一个以16为基数的无符号整数,但Integer.parseInt
将该值解析为有符号整数。由于作为有符号整数的ffffffde
大于Integer.MAX_VALUE
,因此引发了观察到的NumberFormatException
。Integer.toHexString
Javadocs指示parseUnsignedInt
可用于将String
转换回int
:参数的值可以透过呼叫
Integer.parseUnsignedInt(s, 16)
,从传回的字串s
中复原。