由于以下代码行,我收到错误:
int x = color(Integer.parseInt("ffffffde",16));
我想这可能是因为它是负值
有什么想法为什么或如何或如何解决它吗?
编辑:
抱歉,没有包含实际错误。这是:
例外情况 线程“动画线程”java.lang.NumberFormatException:对于输入 字符串:“ffffffde”位于 java.lang.NumberFormatException.forInputString(来源未知) java.lang.Integer.parseInt(来源未知)
编辑2:
值(“ffffffde”)由以下代码创建:
Integer.toHexString(int_val);
编辑3: 事实证明这是一个已知的错误(http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=4215269) 虽然您可以将整数转换为十六进制字符串,但如果它们是负数,则无法将它们转换回来!!
ffffffde
大于整数最大值
Java int 是 32 位有符号类型,范围从 –2,147,483,648 到 2,147,483,647。
ffffffde = 4,294,967,262
您使用
Integer.toHexString(int_val)
将 int 转换为十六进制字符串。来自该方法的文档:
以 16 为基数的 unsigned 整数形式返回整数参数的字符串表示形式。
但是
int
是一个signed类型。
使用
int value = new BigInteger("ffffffde", 16).intValue();
将其恢复为负值。
如果您遇到这样的错误,
Exception in thread "main" java.lang.NumberFormatException: For input string: "ffffffde"
at java.lang.NumberFormatException.forInputString(NumberFormatException.java:48)
at java.lang.Integer.parseInt(Integer.java:461)
at com.TestStatic.main(TestStatic.java:22)
那么您传递的值存在问题,即 ffffffde 。这不是解析为 int 的有效十六进制值。
请尝试这个
int x = Integer.parseInt("ffffde",16);
System.out.println(x);
应该可以。
对于超过此值的十六进制值,您必须解析为 Long
Long x = Long.parseLong("ffffffde",16);
System.out.println(x);
这也应该有效
Integer.parseUnsignedInt
方法而不是 Integer.parseInt
将产生所需的行为。
int x = color(Integer.parseUnsignedInt("ffffffde", 16));
问题是
Integer.toHexString
返回一个以 16 为基数的无符号整数,但 Integer.parseInt
将该值解析为有符号整数。由于 ffffffde
作为有符号整数大于 Integer.MAX_VALUE
,因此会抛出观察到的 NumberFormatException
。
Integer.toHexString
Javadocs 表示 parseUnsignedInt
可用于将 String
转换回 int
:
可以通过调用
s
从返回的字符串Integer.parseUnsignedInt(s, 16)
中恢复参数的值。