当前位置: 首页 > 知识库问答 >
问题:

异常线程"main"java.lang.NumberFormatExcture:对于输入字符串:"9000000000000000"下基数16

澹台胜
2023-03-14

我试图运行此代码,但它发生错误。

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

正如我们所知,长的最小数量是-9,223,372,036,854,775,808和0x9000000000000000-8,070,450,532,247,928,832为什么会发生错误?

共有3个答案

阴焱
2023-03-14

Long.parseLong()不会像算术那样溢出到负数-它不是解析位表示,而是整数的位数。

基数16中最大的long7FFFFFFFFFFFFFFF;您的值比这个大。

用于小数比较:

Base 16            Decimal
7FFFFFFFFFFFFFFF    9,223,372,036,854,775,807
9000000000000000   10,376,293,541,461,622,784
斜高翰
2023-03-14

引用Long#parseLong(String, int)

如果出现以下任何一种情况,将引发NumberFormatExcture类型的异常:

  • 第一个参数为null或长度为零的字符串

示例:
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)抛出一个NumberFormatExc0019
parseLong("Hazelut",10)抛出一个NumberFormatExc0019
parseLong("Hazelut",36)返回1356099454469L

使用基数16解析的十进制值为10376293541461622784,大于Long。最大_值(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);
    }
}
邓元白
2023-03-14

900000000000000基数16是正数,因为没有符号。由于long是有符号的,所以它可以容纳的最大数字是0x7FFF\u FFFF\u FFFF\u FFFF。所以你的太棒了。

如果你想-8,070,450,532,247,928,832,使用parseUnsignedLong()

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

输出:

-8070450532247928832

现在接受最高0xFFFF\u FFFF\u FFFF\u FFFF的值。

 类似资料: