【问题标题】:Why does Byte.parseByte("80", 16) fail?为什么 Byte.parseByte("80", 16) 失败?
【发布时间】:2017-09-07 00:06:13
【问题描述】:
System.out.println(Byte.toString( (byte)(1 << 7) ));//print "-128" 
System.out.println(Byte.parseByte("80", 16));//run time exception java.lang.NumberFormatException: Value out of range. Value:"80" Radix:16

为什么第一个成功而第二个失败?人们可能期望它们产生相同的输出。

【问题讨论】:

  • 你读过javadoc吗?
  • 来自 JavaDoc:我认为最后一个适用于您:如果发生以下任何一种情况,则会引发 NumberFormatException 类型的异常:第一个参数为 null 或长度为零的字符串。基数小于 Character.MIN_RADIX 或大于 Character.MAX_RADIX。字符串的任何字符都不是指定基数的数字,除非第一个字符可以是减号'-'('\u002D')或加号'+'('\u002B'),前提是字符串是长度大于1。字符串表示的值不是byte类型的值。
  • 问你真正的问题。陈述之间的差异是显而易见的。我想您实际上想知道为什么第一个成功而第二个失败,而人们可能期望它们产生相同的输出。
  • @erickson 你所说的正是我想知道的,仍然困惑为什么第二个语句失败。

标签: java hex byte base numberformatexception


【解决方案1】:

十六进制 0x80 是十进制的 128。字节只能保存从 -128 到 127 的值(含)。因此,当您尝试解析 128 的值时,它会失败,因为该值无法表示为 byte

如果要解析负值,需要包含负号:

System.out.println(Byte.parseByte("-80", 16)); /* Prints -128 */

当执行narrowing conversion, 时,例如,从intbyte,如本例所示,有关值的整体大小的信息可能会丢失。将int 值转换为byte 只会丢弃除最低8 位之外的所有位,因此将int 128 转换为byte 会产生-128

【讨论】:

    【解决方案2】:

    第一个运算符是二进制移位。 -128 以二进制代码表示 0b100000001 向左移动了七次。
    在第二个语句中,您使用的基数是 hex 数字,您可以在 Tutorialspoint 的示例中看到。如果将语句更改为System.out.println(Byte.parseByte("80", 10));,则不会出现异常。
    希望这些解释对您有所帮助。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-07-29
      • 2011-05-16
      • 2015-06-19
      • 2014-06-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多