【问题标题】:converting to hexadecimal form using valueOf() method使用 valueOf() 方法转换为十六进制形式
【发布时间】:2015-03-18 22:15:19
【问题描述】:

我有一个变量类型 int,我必须分配负数:-2147483648,问题是我正在尝试使用 valueOf() 方法将其转换为十六进制形式,当我尝试这个时:

Integer.valueOf(String.valueOf(n),16);n 为负数

它抛出异常 java.lang.NumberFormatException: For input string : -214748....

为什么我会得到这个??

【问题讨论】:

  • 因为文字 -2147483648 是一个十进制数,而您试图将其解析为十六进制。
  • @Jesper 如果读取为十六进制,则超出整数范围

标签: java


【解决方案1】:

改用Integer.toString(n, 16) 来获得n 的十六进制表示。

【讨论】:

    【解决方案2】:

    对该问题的简短说明。问题是使用

    Integer.valueOf(String.valueOf(n),16);
    

    您假设-2147483648 是十六进制形式的整数(您正在以16 为底解析-2147483648)并且它比Interger.MIN_VALUE 小得多,因此会导致异常。正如@Jean 建议的那样,请改用Integer.toString(int i, radix)

    来自文档:

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

    • ...

    • 字符串表示的值不是int类型的值。

    【讨论】:

      【解决方案3】:

      这是因为Integer.valueOf(String, int) 将您的 String 参数解析为一个基数为 16 的整数。问题是这两个约束中的一个不成立:

      • String 参数(基数 16)> Integer.MAX_VALUE(基数 2),或
      • String 参数(以 16 为基数)

      检查这些约束正是Integer.parseInt(String, int) 为您所做的。如果你查看Integer.parseInt(String, int)的源代码,你会注意到这段代码抛出了异常:

      if (result < multmin) {
          throw NumberFormatException.forInputString(s);
      }
      

      其中result 是从字符串的开头到结尾进行解析时的中间结果,multminInteger.MAX_VALUE / radix-Integer.MAX_VALUE / radix。 (只加负数的原因是abs(Integer.MIN_VALUE) > abs(Integer.MAX_VALUE))。

      解析正在进行并检测到,如果至少还有一个额外的字符要处理,则必须违反这些约束之一。这就是将引发异常的地方:它表明您向此方法提供了一个无法接受的参数。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2011-03-03
        • 2016-08-21
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-09-04
        • 2014-12-05
        相关资源
        最近更新 更多