Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/356.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 数字格式异常错误_Java_Exception - Fatal编程技术网

Java 数字格式异常错误

Java 数字格式异常错误,java,exception,Java,Exception,每当我运行我的程序时,都会出现以下错误: Exception in thread "main" java.lang.NumberFormatException: For input string: "9999997560" at java.lang.NumberFormatException.forInputString(NumberFormatException.java:48) at java.lang.Integer.parseInt(Integer.java:46

每当我运行我的程序时,都会出现以下错误:

    Exception in thread "main" java.lang.NumberFormatException: For input string: "9999997560"
    at java.lang.NumberFormatException.forInputString(NumberFormatException.java:48)
    at java.lang.Integer.parseInt(Integer.java:461)
    at java.lang.Integer.valueOf(Integer.java:554)
    at jsobcpuburnerpd3.Main.main(Main.java:22)
    Java Result: 1
该程序有两个几乎相同的do-while循环,第一个循环工作得很好。我只对第二个有问题

BigDecimal lower = new BigDecimal("1000001520");
BigDecimal upper = new BigDecimal("9999997560");
int var = 2520;

String strL = lower.toString();
Integer intL = Integer.valueOf(strL);

String strU = upper.toString();
Integer intU = Integer.valueOf(strU);
两个数字的位数相同,并以相同的方式转换为整数。在循环中,两者的处理方式几乎相同

intL = intL + var;

intU = intU - var;
我也尝试过这样做,但没有将BigDecimal转换为String,也没有将数字直接输入String,但仍然得到了相同的错误


编辑我使用BigDecimal,因为这是老师希望我们在工作中使用的一部分。我知道这是不需要的。

显然,您会得到一个数字格式异常,因为可以存储在整数中的最大值是2147483647,小于999997560

另一方面,100001520小于2147483647,这就是为什么它可以正常工作的原因

(根据Tunaki的建议进行编辑)仅供参考-此外,您真的不必使用BigDecimal,因为您需要它的唯一原因似乎是将其转换为整数。因此,这不是必需的


此外,不需要整数,因为您似乎不需要引用类型,因此原语类型int应该是合适的。此外,在for循环中,您从整数中添加和减去值,这将导致不必要的装箱和拆箱,并且效率非常低。因此,最好使用原语类型int。

使用intValue()方法将BigInteger转换为整数


为什么你要从一个
BigDecimal
开始,把它转换成一个
String
(自从你用它构造了
BigDecimal
之后,你已经有了这个字符串),而仅仅是为了从中得到一个
Integer
?!您的第一个错误是假设两个数字具有相同数量的数字,并且与数据类型以任何方式相关。这是正确的,但这并不能解决这里的问题:请参阅我的注释是的,这是正确的。他根本不需要使用整数。而且看起来他在for循环中使用了这个整数,当他增加它时,这将导致不必要的拆箱和装箱。他也可以从int开始,一切都会很顺利。但不管怎么说,这个问题与他为什么会收到numberFormatException有关,我试图解决这个问题。谢谢你,你的评论帮助我找到了一个解决方案,现在我的代码工作了。我最终摆脱了字符串strU,使用了一个BigInteger而不是BigDecimal,并将其放入一个长字符串中。但是,现在我的代码正确地执行了所有必需的内容。从文档中可以看出:如果生成的“BigInteger”太大,无法放入int,则只返回低阶32位。你怎么知道OP想要这个?
BigDecimal lower = new BigDecimal("1000001520");
BigDecimal upper = new BigDecimal("9999997560");

Integer intBL = lower.intValue();
Integer intBU = upper.intValue();