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 にキャストする必要がある。