"main" 线程中的异常:java.lang.NumberFormatException: 以基数16解析字符串"9000000000000000"失败

9

我尝试运行这段代码,但出现了错误。

System.out.println(Long.parseLong("9000000000000000", 16));

我们知道最小的长整型数是-9,223,372,036,854,775,808,而0x9000000000000000的值为-8,070,450,532,247,928,832,为什么会出现错误呢?

3个回答

10

9000000000000000的十六进制表示是一个正数,因为没有符号。由于long是有符号的,它能够容纳的最大数字是0x7FFF_FFFF_FFFF_FFFF。因此,你的数字太大了。

如果你想使用-8,070,450,532,247,928,832,可以使用parseUnsignedLong()函数:

        System.out.println(Long.parseUnsignedLong("9000000000000000", 16));

输出:

-8070450532247928832

现在接受的值高达0xFFFF_FFFF_FFFF_FFFF。


2

关于Long#parseLong(String,int)的说明:

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

  • 第一个参数为null或长度为零的字符串。
  • 基数小于Character.MIN_RADIX或大于Character.MAX_RADIX。
  • 字符串中的任何字符不是指定基数的数字,但如果字符串长度大于1,则第一个字符可以是减号'-' ('\u002d')或加号'+' ('\u002B')。
  • 字符串表示的值不是long类型的值。

示例:
  parseLong("0", 10) 返回 0L
  parseLong("473", 10) 返回 473L
  parseLong("+42", 10) 返回 42L
  parseLong("-0", 10) 返回 0L
  parseLong("-FF", 16) 返回 -255L
  parseLong("1100110", 2) 返回 102L
  parseLong("99", 8) 抛出NumberFormatException
  parseLong("Hazelnut", 10) 抛出NumberFormatException
  parseLong("Hazelnut", 36) 返回 1356099454469L

使用基数16解析的十进制值为10376293541461622784,大于Long.MAX_VALUE(9223372036854775807),违反以下条件:

字符串表示的值不是long类型的值

因此抛出NumberFormatException异常。

import java.math.BigInteger;

public class ParseLong {
    public static void main(String[] args) {
        System.out.println("Max Long value :" + Long.MAX_VALUE);
        System.out.println("Min Long value :" + Long.MIN_VALUE);
        System.out.println("Value without overflow " + new BigInteger("9000000000000000", 16));
        System.out.println("Value by parseUnsigned " + Long.parseUnsignedLong("9000000000000000", 16));
        System.out.println("Value by literal " + 0x9000000000000000L);
    }
}

但为什么 g 0x9000000000000000 不能使用 Long.parseLong(),它在64字节有符号长整型的范围内。 - Moly Holy

1

Long.parseLong()不会像算术运算一样“溢出”为负数——它不是解析位表示,而是整数的数字。

十六进制中最大的long7FFFFFFFFFFFFFFF;您的值比这还要大。

以十进制进行比较:

Base 16            Decimal
7FFFFFFFFFFFFFFF    9,223,372,036,854,775,807
9000000000000000   10,376,293,541,461,622,784

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接