![](/img/trans.png)
[英]Why Integer.valueOf cannot parse the hex string back to integer
[英]Why can I parse an 8 digit hex into a Long, and convert it to an Integer, but not parse as an Integer directly?
我正在尝试使用ColorDrawable(int color)
。 该类只有一个int
构造函数。 通常,你可以这样做:
ColorDrawable(0xFF8E8F8A)
但由于我的颜色是字符串(6个十六进制数字,没有alpha),我必须这样做:
Long color = Long.parseLong("FF"+hexColorString, 16); // hexColorString like "8E8F8A"
ColorDrawable drawable = new ColorDrawable(color.intValue());
为什么Integer.parseInt("FF"+hexColorString, 16)
只返回一个负数(有效无符号)int,而不是抛出NumberFormatException
?
编辑:我的问题更简洁的版本:
为什么Long.parseLong("FF"+hexColorString, 16).intValue()
和Integer.parseInt("FF"+hexColorString, 16)
返回相同的值? 前者有效,但后者给了我一个例外。
编辑:无论如何我没有得到正确的颜色,所以我切换到以下方法:
ColorDrawable drawable = new ColorDrawable(Color.parseColor("#FF"+hexColorString));
0xFF8E8F8A
的值> Integer.MAX_VALUE
。
由于没有溢出或下溢按设计抛出Exception
,因此它会将您的值解释为Integer.MIN_VALUE
,因为Integer.MAX_VALUE + 1
会转换为Integer.MIN_VALUE
。
因此, Long.intValue
会将值转换为int
,其中给定值为Integer.MAX_VALUE + x
,其中x > 0
,将从Integer.MIN_VALUE
,即Integer.MIN_VALUE + x
。
但是,来自Integer
javadoc:
如果发生以下任何一种情况,则抛出NumberFormatException类型的异常:
第一个参数为null或者是长度为零的字符串。 [...]字符串表示的值不是int类型的值。
值0xFF8E8F8A
不是int
类型,因此是NumberFormatException
。
作为旁注,我很确定ColorDrawable
构造函数接受一个int
因为它需要一个id而不是颜色的数字表示,但说实话,文档并不十分清楚。
请在此处查看R.color
文档。
最后的注释 - 在这一点上归功于OP 。
您可以使用new ColorDrawable(Color.parseColor(yourHexString))
来获得更方便的方法。
因为0xFF8E8F8A
超出整数范围。 即0xFF8E8F8A
== 4287532938
,它大于Integer.MAX_VALUE
。
假设0xFF8E8F8A
等于-7434358
(通过Long解析时得到的值)不正确,因为您可以解析负十六进制值:
Integer.parseInt("-717076", 16);
所以-0x717076
等于-7434358
,无符号表示为0xFF8E8F8A
。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.