Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/401.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何将十六进制颜色字符串解析为整数_Java_Integer_Hex_Robolectric - Fatal编程技术网

Java 如何将十六进制颜色字符串解析为整数

Java 如何将十六进制颜色字符串解析为整数,java,integer,hex,robolectric,Java,Integer,Hex,Robolectric,我正在研究Robolectric中的一些代码,即IntegerResourceLoader。当rawValue为0xFFFF0000时,以下方法将抛出RuntimeException: @Override public Object convertRawValue( String rawValue ) { try { return Integer.parseInt( rawValue ); } catch ( NumberFormatException nfe )

我正在研究Robolectric中的一些代码,即
IntegerResourceLoader
。当
rawValue
0xFFFF0000时,以下方法将抛出
RuntimeException

@Override
public Object convertRawValue( String rawValue ) {
    try {
        return Integer.parseInt( rawValue );
    } catch ( NumberFormatException nfe ) {
        throw new RuntimeException( rawValue + " is not an integer." );
    }
}

我尝试使用,但这会引发NumberFormatException,即使语法似乎正确。

如果可以从前面去掉0x,则可以设置parseInt()的基数。所以
Integer.parseInt(myHexValue,16)

有关更多信息,请参见,int)

rawValue
0xFFFF0000

这是因为
Integer.parseInt
不是为处理
0x
前缀而设计的

我尝试使用Integer.decode(String),但这会引发NumberFormatException,即使语法看起来是正确的

Integer.decode
Javadoc(在您的问题中链接):

此字符序列必须表示正值,否则将引发NumberFormatException

0xFFFF0000
是一个负数,因此这很可能是引发异常的原因

解决方案:

如果您知道给定的值的格式为
0x[hexdigits]
,则可以使用以基数为单位的。对于十六进制,基数是16。像这样:

return Integer.parseInt(rawValue.split("[x|X]")[1], 16);

它使用regex
[x | x]
分割字符串,该字符串将在小写或大写“x”字符上分离
rawValue
,然后将其以16为基数传递给
parseInt
,以十六进制对其进行解析。

decode()
是正确的调用方法,但它失败了,因为0xFFFF0000高于整数的0x7fffffff最大限制。你可能需要考虑长时间。

< P>这就是Android是如何运行的:

private int parseColor(String colorString) {
    if (colorString.charAt(0) == '#') {
        // Use a long to avoid rollovers on #ffXXXXXX
        long color = Long.parseLong(colorString.substring(1), 16);
        if (colorString.length() == 7) {
            // Set the alpha value
            color |= 0x00000000ff000000;
        } else if (colorString.length() != 9) {
            throw new IllegalArgumentException("Unknown color");
        }
        return (int)color;
    }
    throw new IllegalArgumentException("Unknown color");
}

如果知道它是0x,则不需要使用split(每次转换颜色时都会编译正则表达式),而是可以使用
O(1)
操作:
parseInt(rawValue.substring(2))
。Java字符串针对不起作用的
子字符串
进行了优化(请参见
Java.lang.String
中的
offset
count
字段)。我试过了。java.lang.NumberFormatException:无效int:“98E91E63”98是什么Alpha@sud007我的解决方案要求字符串为“0x98E91E63”,否则您可以使用
Integer.parseInt(“98E91E63”,16)
来解析整数。@Brian我尝试了相同的
Integer.parseInt(“98E91E63”,16)
无效!