4

我正在编写 Robolectric 中的一些代码,即IntegerResourceLoader. 以下方法抛出一个RuntimeExceptionwhenrawValue是诸如0xFFFF0000 之类的东西:

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

我尝试使用Integer.decode(String),但即使语法似乎正确,也会引发 NumberFormatException 。

4

4 回答 4

6

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

于 2012-09-04T18:33:44.550 回答
2

下面的方法是抛出一个RuntimeException什么时候rawValue是这样的0xFFFF0000

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

我尝试使用 Integer.decode(String) ,但即使语法似乎正确,也会引发 NumberFormatException 。

来自Integer.decodeJavadoc(在您的问题中链接):

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

0xFFFF0000是一个负数,因此这很可能是导致此处抛出异常的原因。

解决方案:

如果您知道给定的值将采用 形式0x[hexdigits],那么您可以使用Integer.parseInt(String, int)which 采用基数。对于十六进制,基数是 16。像这样:

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

这使用正则表达式[x|X]来拆分字符串,该字符串将rawValue在小写或大写“x”字符上分开,然后将其传递parseInt给以 16 为基数的字符串,以将其解析为十六进制。

于 2012-09-04T18:33:01.610 回答
2

这就是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");
}
于 2015-09-14T15:01:34.600 回答
1

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

有关详细信息,请参阅http://docs.oracle.com/javase/6/docs/api/java/lang/Integer.html#parseInt(java.lang.String , int)

于 2012-09-04T18:27:50.870 回答