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();