8桁の16進数(4バイト)を含む文字列を解析したいのですが、NumberFormatExceptionが発生しました。ここで何が問題になっていますか?
assertThat(Integer.parseInt("FFFF4C6A",16),is(0xFFFF4C6A));
あなたの数は、intに割り当て可能な数よりも大きい数を表します。試す:
Long.parseLong("FFFF4C6A", 16);
これは4294921322を与えます。
ドキュメントから:
次のいずれかの状況が発生した場合、タイプの例外
NumberFormatException
がスローされます。
- 最初の引数がnullであるか、長さがゼロの文字列です。
- 基数は。よりも小さい
Character.MIN_RADIX
か大きいかのいずれかですCharacter.MAX_RADIX
。- 文字列のどの文字も、指定された基数の数字ではありません…</ li>
- 文字列で表される値は、int型の値ではありません。
そしてそれはあなたが打っている4番目のケースです。
これは、Integer.parseInt("FFFF4C6A",16)
提供された値がInteger.MAX_VALUEを超えているためです。public static final int MAX_VALUE = 0x7fffffff;
ここで、parseInt(...)のJavadocに従って、次のいずれかの場合にNumberFormatExceptionが発生します。
次のいずれかの状況が発生した場合、タイプNumberFormatExceptionの例外がスローされます。
- 最初の引数がnullであるか、長さがゼロの文字列です。
- 基数は、Character.MIN_RADIXよりも小さいか、Character.MAX_RADIXよりも大きいかのいずれかです。
- 文字列のどの文字も、指定された基数の数字ではありません。ただし、最初の文字はマイナス記号'-'('\ u002D')またはプラス記号'+'('\ u002B')である場合があります。長さ1より長い。
- 文字列で表される値は、int型の値ではありません。
あなたの場合、提供された文字列値がInteger.MAX_VALUEを超えているため、NumberFormatExceptionの4番目の句を満たしています。
考えられる解決策:これを解析するLong.parseLong(...)
には、MAX_VALUEが次のように定義されている場所を使用します。`public static final long MAX_VALUE = 0x7fffffffffffffffL
整数の範囲を超えました。
Integer.MAX_VALUE = 2147483647
0xFFFF4C6A = 4294921322
作品としてそれを解析するLong
:
Long.parseLong("FFFF4C6A",16)
その16進文字列を整数として表現したいだけの場合(32ビットであるため)、次を使用する必要がありますBigInteger
。
new BigInteger("FFFF4C6A", 16).intValue()
assertThat()メソッドはわかりませんが、16進数の「FFFF4C6A」は整数には大きすぎます。
たとえば、次のように記述します。
int number = Integer.parseInt( "FFFF4C6A"、16)
同じエラーが発生します。コードを書く正しい方法は次のようになります:
倍数=Integer.parseInt( "FFFF4C6A"、16)