0

8桁の16進数(4バイト)を含む文字列を解析したいのですが、NumberFormatExceptionが発生しました。ここで何が問題になっていますか?

assertThat(Integer.parseInt("FFFF4C6A",16),is(0xFFFF4C6A));
4

5 に答える 5

3

あなたの数は、intに割り当て可能な数よりも大きい数を表します。試す:

Long.parseLong("FFFF4C6A", 16);

これは4294921322を与えます。

ドキュメントから:

次のいずれかの状況が発生した場合、タイプの例外NumberFormatExceptionがスローされます。

  • 最初の引数がnullであるか、長さがゼロの文字列です。
  • 基数は。よりも小さいCharacter.MIN_RADIXか大きいかのいずれかですCharacter.MAX_RADIX
  • 文字列のどの文字も、指定された基数の数字ではありません…</ li>
  • 文字列で表される値は、int型の値ではありません。

そしてそれはあなたが打っている4番目のケースです。

于 2012-09-13T09:35:49.620 に答える
2

これは、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

于 2012-09-13T09:34:01.987 に答える
1

整数の範囲を超えました。

Integer.MAX_VALUE = 2147483647
0xFFFF4C6A = 4294921322

作品としてそれを解析するLong

Long.parseLong("FFFF4C6A",16)
于 2012-09-13T09:34:46.797 に答える
1

その16進文字列を整数として表現したいだけの場合(32ビットであるため)、次を使用する必要がありますBigInteger

new BigInteger("FFFF4C6A", 16).intValue()
于 2014-04-07T10:35:54.167 に答える
0

assertThat()メソッドはわかりませんが、16進数の「FFFF4C6A」は整数には大きすぎます。

たとえば、次のように記述します。

int number = Integer.parseInt( "FFFF4C6A"、16)

同じエラーが発生します。コードを書く正しい方法は次のようになります:

倍数=Integer.parseInt( "FFFF4C6A"、16)

于 2012-09-13T09:40:00.317 に答える