【问题标题】:Unexpected NumberFormatException while parsing a hex string to an int value将十六进制字符串解析为 int 值时出现意外的 NumberFormatException
【发布时间】:2012-09-13 09:25:41
【问题描述】:

我想解析一个包含 8 个十六进制数字(4 个字节)的字符串,但我得到了一个 NumberFormatException。这里有什么问题?

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

【问题讨论】:

    标签: java hex


    【解决方案1】:

    您的数字代表一个大于可分配给 int 的数字。试试:

    Long.parseLong("FFFF4C6A", 16);
    

    给出 4294921322。

    来自doc

    如果出现以下任何一种情况,则会抛出NumberFormatException 类型的异常:

    • 第一个参数为空或长度为零的字符串。
    • 基数要么小于Character.MIN_RADIX,要么大于Character.MAX_RADIX
    • 字符串的任何字符都不是指定基数的数字,...
    • 字符串表示的值不是int类型的值。

    这是您遇到的第 4 个案例。

    【讨论】:

      【解决方案2】:

      这是因为提供的Integer.parseInt("FFFF4C6A",16) 超过了Integer.MAX_VALUE 定义为public static final int MAX_VALUE = 0x7fffffff;

      现在,根据 parseInt(...) 的 Javadoc,您将在以下任一情况下遇到 NumberFormatException

      如果发生以下任何一种情况,则会抛出 NumberFormatException 类型的异常:

      • 第一个参数为空或长度为零的字符串。
      • 基数小于 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

      【讨论】:

        【解决方案3】:

        您已超出整数范围。

        Integer.MAX_VALUE = 2147483647
        0xFFFF4C6A = 4294921322
        

        将其解析为 Long 有效:

        Long.parseLong("FFFF4C6A",16)
        

        【讨论】:

        • 也许 16 而不是 Character.MAX_RADIX 更好地表达了 OP 的意图
        【解决方案4】:

        如果你只想将那个十六进制字符串表示为一个整数(因为它是 32 位),你需要使用BigInteger:

        new BigInteger("FFFF4C6A", 16).intValue()
        

        【讨论】:

          【解决方案5】:

          我不知道 assertThat() 方法,但是你的十六进制数“FFFF4C6A”对于整数来说太大了。

          例如,如果你写:

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

          你会得到同样的错误。 编写代码的正确方法是:

          双数 = Integer.parseInt("FFFF4C6A",16)

          【讨论】:

            猜你喜欢
            • 2019-01-10
            • 2012-07-07
            • 2015-11-23
            • 2016-07-17
            • 2019-04-18
            • 2016-02-21
            • 2015-08-02
            • 1970-01-01
            • 2016-12-15
            相关资源
            最近更新 更多