2016-11-14 3 views
0

これは間違って行われた場合、私の謝罪です(また、プログラミングにも比較的新しいので、無関係のヒントも高く評価されます)。Java - Try/Catch NumberFormatExceptionは以前の値を使用していますか?

私はJavaで基本的な電卓プログラムを書きました。現在はうまく動作していますが、NumberFormatExceptionに特有の問題があります。

private static double spaceTestAndConvert(String numInput){ 

    Scanner input= new Scanner(System.in); 

    if (numInput.equalsIgnoreCase("quit")){ 
     System.exit(1); 
    } 
    else if(numInput.equalsIgnoreCase("C/E")){ 
     Restart(); 
    } 

    try{ 
     return Double.parseDouble(numInput.trim()); 
    } 
    catch(NumberFormatException nfe){ 
     numInput = ""; 
     System.out.println("Please enter only one number without any spaces or letters: "); 
     numInput = input.nextLine(); 
     spaceTestAndConvert(numInput.trim()); 
     return Double.parseDouble(numInput.trim()); 
    } 
} 

問題はNumberFormatExceptionが原因となり、その後、有効な入力に入るだろういくつかの入力に入力することによって、エラーを強制しようとした後、プログラムが以前の無効な入力を引用はNumberFormatExceptionからクラッシュするということである。ここでは、コードです。

I.E. -

"1 2 3" 
loops back 
"1 2 q 3" 
loops back 
"12q3 3 sqw 1" 
loops back 
"12" 
crash - Exception in thread "main" java.lang.NumberFormatException: For input string: "12q3 3 sqw 1" 

例外が数回発生した後にのみ発生します。なぜそれがこれをやっているのですか?これを修正する方法や何が起こっているのかについてのアドバイスはありますか?コードの他の部分が必要な場合は、私に教えてください!ありがとう!

+0

"3 12q3"を入力するとクラッシュしますか? – Matt

+1

return spaceTestAndConvert(numInput.trim())と言ってもいいですか? – kirbyquerby

+0

少なくとも、それに入る最初の試みではない。私は何度かそれを入力し、その後、有効な入力を入力し、クラッシュしました(質問の例に似ています)。 @kirby - Nah。私は有効な入力を取得すると、文字列をダブルに解析する必要があります。そして、その価値を返す。 –

答えて

2

あなたは再帰的spaceTestAndConvert関数を呼び出しますが、離れて投げている私は、あなたが言っているすべてのものに従っていませんが、これらの2行(あなたのcatchブロック内からは)問題になり...

spaceTestAndConvert(numInput.trim()); 
return Double.parseDouble(numInput.trim()); 

値。私はあなたがなぜそれを呼び、その価値に興味を持っていないのか理解していません。

2行目も混乱しています。 try/catchで最初の呼び出しを慎重にDouble.parseDouble()に囲みますが、その後catchブロック内でもう一度呼び出します。 2番目のDouble.parseDouble()NumberFormatExceptionを生成する場合、それは捕らえられません。

+0

ありがとう、ドリュー!それが問題でした。 try/catch(と再帰)を使用して初めて、しかしそれはすべて固定され、働いています。 –

+0

はい。これらの2行を 'return spaceTestAndConvert(numInput.trim()); 'に置き換えると、すべてうまく動作します。 –

0

キャッチでリターンを削除すると、問題が解決します。あなたが戻ってきた場合、あなたはキャッチされているので、あなたは無効な数値形式を返すだろうからです。あなたがしたいことは、現在有効なときに値を返すことです。実際には試しの中でそれを実際に実行しています。プログラムがエラーを返すように強制しないでください(実際にはエラーが発生するため、キャッチされています)。

(再帰のために)適切な値を得た後に以前のメソッドに戻ると、異なる変数であるため、最終部分から得た成功値を除いてエラー値のスタックが残ります。

private static double spaceTestAndConvert(String numInput){ 

Scanner input= new Scanner(System.in); 

if (numInput.equalsIgnoreCase("quit")){ 
    System.exit(1); 
} 
else if(numInput.equalsIgnoreCase("C/E")){ 
    Restart(); 
} 

try{ 
    return Double.parseDouble(numInput.trim()); 
} 
catch(NumberFormatException nfe){ 
    numInput = ""; 
    System.out.println("Please enter only one number without any spaces or letters: "); 
    numInput = input.nextLine(); 
    spaceTestAndConvert(numInput.trim()); 
} 
} 
関連する問題