2016-04-13 61 views
-2

我得到这个错误,每当我跑我的程序:数字格式异常错误

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 

程序有两种做-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,但仍然得到了同样的错误。

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

+0

为什么你开始用'BigDecimal',将其转换为一个'String'(你已经有了,因为你contrusted了'BigDecimal'转换的BigInteger的为整型与它)只是为了使一个'整数'呢?! – Tunaki

+0

您的第一个错误是做出这样的假设:_两个数字具有相同数量的数字_以任何方式与数据类型相关。 – Savior

回答

3

显然你会得到一个数字格式异常,因为可以存储在整数中的最大值是2,147,483,647,它小于9,999,997,560。

另一方面1,000,001,520小于2,147,483,647,这就是为什么工作正常。 FYI - 此外,您实际上不必使用BigDecimal,因为它似乎是您需要它的唯一原因是将其转换为Integer。所以这不是必需的。

另外一个整数不是必需的,因为你似乎不需要引用类型,因此原始类型int应该是apt。此外,在for循环中,您将从Integer中添加和减去值,这会导致不必要的装箱和拆箱,并且效率非常低。所以使用原始类型int会更好。

+0

这已经足够了,但它并不能解决这里明确的[XY情况](http://meta.stackexchange.com/questions/66377/what-is-the-xy-problem):请参阅我的评论http: //stackoverflow.com/questions/36604954/number-format-exception-errors#comment60806898_36604954 – Tunaki

+0

是的,这是正确的。他根本不需要使用Integer。而且他看起来像是在一个for循环中使用这个Integer,当他增加它时会导致不必要的拆箱和装箱。他可能已经开始了一个整数,事情会工作得很好。 但无论如何,这个问题与他为什么要得到一个numberFormatException并且我试图解决这个问题有关。 – Madhusudhan

+0

谢谢,您的评论帮助我找到了解决方案,现在我的代码正常工作。我最终摆脱了String strU,并使用了一个BigInteger而不是BigDecimal,并把它放到了一个很长的位置。但是,现在我的代码正确执行所有必需的东西。 – JSob

-2

使用的intValue()方法

BigDecimal lower = new BigDecimal("1000001520"); 
BigDecimal upper = new BigDecimal("9999997560"); 

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

从文档:*如果生成的“BigInteger”太大而无法放入int,则只返回低位的32位。*您如何知道OP需要它? – Tunaki