Integer.parseInt(String, int) の使用上の注意

Integer.parseInt(String, int) には使用上注意しなければならない挙動があり、結果が負の値になる 16 進数文字列をパースすると NumberFormatException が発生する。

わかりやすいのは以下の例。

    Integer.parseInt("80", 16); // 128
    Integer.parseInt("FFFFFFFF", 16); // -1 を期待するが NumberFormatException
    Integer.parseInt("80000000", 16); // -2147483648 を期待するが NumberFormatException

これは 16 進数の値が常に正の整数としてパースされてしまい、例えば "80000000" は Integer.MAX_VALUE + 1 に相当するため、int 範囲外として例外が発生する。

最大 8 桁の 16 進数が外部から渡され、それを int の値に変換したい場合、

    (int) Long.parseLong(s, 16);

のように long としてパースして int にキャストする必要がある。