2016-04-13 14 views
-2

は、私はこのエラーを取得する:Number形式例外エラー

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 

プログラムは、2つのやる-しばらくほぼ同一であり、ループ、完全に最初の作品があります。私は2番目の問題にのみ問題があります。

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; 

は、私はまた、StringにはBigDecimalからの変換、およびStringに数値を直接入力することなく、これを試みたが、それでも同じエラーを持っています。

EDIT私はBigDecimalを使用しています。これは、先生が私たちの仕事で使用したかったものの一部です。私はそれが必要ではないことを知っています。

+0

は、なぜあなたは 'BigDecimal'をcontrustedので、あなたが既に持っていることを(あなたは、' BigDecimal'で始めている 'STRING'に変換するために使用して整数にBigIntegerの変換それだけで '整数 'を作るために)? – Tunaki

+0

あなたの最初の間違いは、両方の数字が同じ桁数を持っているという前提を作り出していたことです。どのような形でもデータ型に関連しています。 – Savior

答えて

3

整数に格納できる最大値が2,147,483,647で9,999,997,560未満であるため、明らかに数値書式の例外が発生します。

一方、1,000,001,520は2,147,483,647未満です。これが問題なく動作します。

(Tunakiさんの提案に基づいて編集してください)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を使用しているため、不要なアンボクシングとボクシングが発生する可能性があります。彼はintで始まるかもしれないし、物事はうまくいっていただろう。 とにかく、なぜ彼がnumberFormatExceptionを取得しているのかという疑問があり、その問題に取り組んでいます。 – Madhusudhan

+0

ありがとうございました、あなたのご意見は解決策を見つける手助けとなりました。私はString strUを取り除き、BigDecimalの代わりにBigIntegerを使用し、longに入れました。しかし、今、私のコードは必要なものすべてで適切に実行されます。 – JSob

-2

intValue()メソッド

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

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

docs:*結果の "BigInteger"が大きすぎてintに収まらない場合、下位32ビットのみが返されます* OPがそれを望んでいることをどのように知っていますか? – Tunaki