我正在研究Robolectric中的一些代码,即IntegerResourceLoader
。当RuntimeException
是 0xFFFF0000 之类的内容时,以下方法会抛出rawValue
:
@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。
答案 0 :(得分:6)
decode()
是正确的调用方法,但它失败,因为0xFFFF0000高于0x7fffffff整数的最大限制。你可能想要考虑Long。
答案 1 :(得分:2)
以下方法在
RuntimeException
rawValue
等0xFFFF0000
时抛出Integer.parseInt
这是因为0x
并非旨在处理Integer.decode
前缀。
我尝试使用Integer.decode(String),但即使语法看起来是正确的,也会引发NumberFormatException。
来自0xFFFF0000
Javadoc(在你的问题中链接):
这个字符序列必须表示正值,否则将抛出NumberFormatException。
0x[hexdigits]
是一个负数,所以这可能是导致异常被抛出的原因。
<强>解决方案:强>
如果您知道给定的值将采用return Integer.parseInt(rawValue.split("[x|X]")[1], 16);
格式,那么您可以使用Integer.parseInt(String, int)
取基数。对于十六进制,基数是16.像这样:
[x|X]
这使用正则表达式rawValue
来拆分字符串,这将在小写或大写“x”字符上分隔parseInt
,然后将其传递给{{1}} 16的基数用十六进制解析它。
答案 2 :(得分: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");
}
答案 3 :(得分:1)
如果你可以从前面剥离0x,那么你可以设置parseInt()的基数。所以Integer.parseInt(myHexValue,16)
有关详细信息,请参阅http://docs.oracle.com/javase/6/docs/api/java/lang/Integer.html#parseInt(java.lang.String,int)