为什么我可以将8位十六进制解析为Long,并将其转换为Integer,但不能直接解析为Integer?

时间:2014-08-29 14:11:39

标签: java parsing integer long-integer

我正在尝试使用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));

2 个答案:

答案 0 :(得分:3)

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

但是,来自0xFF8E8F8A javadoc:

  

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

     

第一个参数为null或者是长度为零的字符串。 [...]   字符串表示的值不是int类型的值。

int的值不属于NumberFormatException,因此ColorDrawable

作为旁注,我非常确定int构造函数需要R.color,因为它需要一个id而不是颜色的数字表示,但说实话,文档不是&很清楚这一点。

请参阅new ColorDrawable(Color.parseColor(yourHexString))文档here

最后的注释 - 此信用额转入OP

您可以使用{{1}}来获得更方便的方法。

答案 1 :(得分:1)

因为0xFF8E8F8A超出整数范围。即0xFF8E8F8A == 4287532938,并且大于Integer.MAX_VALUE

假设0xFF8E8F8A等于-7434358(通过Long解析时获得的值)不正确,因为您可以解析负十六进制值:

Integer.parseInt("-717076", 16);

所以-0x717076等于-7434358,无符号表示为0xFF8E8F8A