2012-02-23 8 views
0

私は計算機として使用するGUIを持っています。数値以外の値を入力すると、意図したとおりNumberFormatExceptionがスローされます。しかし、 "23423f"のような数字を入力すると、プログラムはフロートに入っていると思っているように思えますが、最後のfのために例外はスローされません。フロートが例外をスローさせるにはどうすればいいですか?

現在、私は入力セクションをtry catchブロックに入れています。ここで、double型に解析し、NumberFormatExceptionがある場合はそれをキャッチします(数値は2倍に解析できるためです) 0以外の入力に対してif文からIllegalArgumentExceptionをスローする別のキャッチブロック

これは単なる推測ですが、最後のfだけが例外をスローしない理由はわかりません。あなたが説明した入力が有効なフロート/ダブル番号ですので、あなたはそれを解析することができることを期待するので、あなたの理論は、おそらく正しいよう

 try 
     { 
     // get the total sales. the input is a string 
      stringInput = salesInputField.getText(); 
       double validAmount = Double.parseDouble(stringInput); 
       if (validAmount < 0) 
        throw new IllegalArgumentException(); 

     // calculate the sales and county tax 
      stateTaxes = validAmount * STATE_TAX; 
      countyTaxes = validAmount * COUNTY_TAX; 

     // display a message dialog showing the miles 
      JOptionPane.showMessageDialog(null, "State Sales Tax: " + percent.format(stateTaxes) + "\n" + 
               "County Sales Tax: " + percent.format(countyTaxes) + "\n", 
               "Taxes Owed", 
               JOptionPane.PLAIN_MESSAGE); 
     } 
      catch (NumberFormatException error) 
      { 
       JOptionPane.showMessageDialog(null, "Invalid Amount", "Input Error", JOptionPane.ERROR_MESSAGE); 
      } 
       catch (IllegalArgumentException error) 
      { 
       JOptionPane.showMessageDialog(null, "Invalid Amount", "Input Error", JOptionPane.ERROR_MESSAGE); 
      } 
+0

「1.2e + 3」のように指数部に「e」を加えた場合は、「d」も使用できます。 – Thilo

答えて

1

が鳴ります。

明らかな解決策は、文字列が有効な文字(おそらくdddd.ddのようなもの)を含んでいるかどうかをチェックすることです。

一般的なコメント:お金の値を整数で保存すると、恐ろしい丸めの問題が発生する可能性があります。それのために私の言葉を取って、ちょうどそれを取らないでください。

+0

+1「浮動小数点を使用しないでください」。 BigDecimalを使用します。 – Thilo

+0

返信いただきありがとうございます。 "明らかな解決策は、文字列が有効な文字(おそらくdddd.ddのようなもの)を考慮しているかどうかをチェックすることです。"それを行うために使用できる方法はありますか? – Jerinos

+0

NumberFormatクラスを見てみましょう。基本的には、あなたが納得しているものを使ってNumberFormatを作成し、それを使って文字列を解析します。パーサーが失敗した場合、文字列は無効です。 – John3136

関連する問題