1

整数値に変換される文字列に多数の 16 進文字を挿入すると、例外が発生します。

コード:

//variables used in this problem
int INT_MAX = 2147483647;
int INT_MIN = -2147483648;
int currentBase = 16;
string displayValue;

switch(currentBase) {
    case 16:
        if((Integer.valueOf(displayValue + "F", currentBase) >= INT_MIN) && (Integer.valueOf(displayValue + "F", currentBase) <= INT_MAX))
        {
            displayValue += "F";
        }
        break;
}

エラーメッセージ:

E/AndroidRuntime(6944): Caused by: java.lang.NumberFormatException: Invalid int: "FFFFFFFF"
E/AndroidRuntime(6944):     at java.lang.Integer.invalidInt(Integer.java:138)
E/AndroidRuntime(6944):     at java.lang.Integer.parse(Integer.java:378)
E/AndroidRuntime(6944):     at java.lang.Integer.parseInt(Integer.java:366)
E/AndroidRuntime(6944):     at java.lang.Integer.valueOf(Integer.java:510)
E/AndroidRuntime(6944):     at com.example.calculator.MainActivity.send_f(MainActivity.java:968)

この文字列の値は、サイズ int (32 ビット) を超えないようにする必要があります。助言がありますか?

4

4 に答える 4

1

Greg Hewgill のコメントは正しいです。ビットを自動的に解釈しようとしているようです。おそらく最も簡単なことは次のようなものです

 Long.valueOf(displayValue + "F", currentBase).intValue();

ビットを取得してから、int に切り捨てます。もちろん、引数Long.valueOfが 32 ビットに収まるようにするのはあなたの責任です。

于 2013-09-01T03:27:08.220 に答える
1

FFFFFFFF が大きすぎます。最大 int 値は 0x7FFFFFFF です。回避策は次のとおりです。

int i = (int)Long.parseLong(hexStr, 16);
于 2013-09-01T03:29:31.883 に答える
0
try {
    // try your calculation here
} catch (NumberFormatException e) {
    // assign the variable the max/min value instead
    // or whatever behavior you want
}

このコードは、範囲外の数値に対してデフォルトの動作を提供します。

于 2013-09-01T03:17:25.670 に答える
0

16 進文字列から int への変換に間違った方法を使用しているように思えます。私の理解が間違っている場合はお知らせください

重複した投稿を引用しています

    String hex = "ff"

// small values
    int value = Integer.parseInt(hex, 16);  

// big values
    BigInteger value = new BigInteger(hex, 16);

私が引用した重複した投稿を参照してください

メソッドの API リファレンス

于 2013-09-01T03:21:09.323 に答える