4

私はRobolectricでいくつかのコードに取り組んでいますIntegerResourceLoader. 次のメソッドは、 0xFFFF0000などのRuntimeExceptionwhenをスローしています。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 がスローされます。

4

4 に答える 4

6

decode()は呼び出すのに適切なメソッドですが、0xFFFF0000が整数の0x7fffffff最大制限よりも大きいため失敗します。ロングを検討することをお勧めします。

于 2012-09-04T18:33:44.550 に答える
2

RuntimeException次のメソッドはwhen rawValueis のようなものをスローしています0xFFFF0000

これは、がプレフィックスInteger.parseIntを処理するように設計されていないためです。0x

Integer.decode(String) を使用してみましたが、文法が正しいように見えても NumberFormatException がスローされます。

Integer.decodeJavadocから(質問にリンクされています):

この一連の文字は正の値を表す必要があり、そうでない場合は NumberFormatException がスローされます。

0xFFFF0000は負の数であるため、ここで例外がスローされる原因となっている可能性があります。

解決:

指定された値が の形式になることがわかっている場合は、基数を取る which を0x[hexdigits]使用できます。Integer.parseInt(String, int)16 進数の場合、基数は 16 です。

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

これは、正規表現を使用し[x|X]て文字列を分割します。文字列は、rawValue小文字または大文字の「x」文字で分離されparseInt、基数 16 で に渡され、16 進数で解析されます。

于 2012-09-04T18:33:01.610 に答える
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 に答える