【问题标题】:How can I make a float throw an exception, when entered?输入时如何使浮点数引发异常?
【发布时间】:2012-02-23 10:23:03
【问题描述】:

我有一个用作计算器的 GUI。当我输入除数字以外的任何内容时,它会按预期抛出 NumberFormatException。但是当我输入诸如“23423f”之类的数字时,程序似乎认为我正在输入一个浮点数并且不会抛出异常,因为最后是 f,即使所有其他字母都会抛出异常。

目前,我所做的只是将输入部分放入一个 try catch 块中,在那里我将其解析为双精度数,并让它捕获一个 NumberFormatException 如果有一个(因为只有数字可以解析成双精度数),和另一个 catch 块,用于从 if 语句中为任何小于 0 的输入抛出 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);
           }

【问题讨论】:

  • 并非所有其他字母,'d' 表示双精度,以及 'e' 表示指数,如 '1.2e+3'

标签: try-catch


【解决方案1】:

听起来你的理论可能是正确的,因为你描述的输入是一个有效的浮点数/双精度数,所以你希望能够解析它。

明显的解决方案是检查字符串是否仅包含您认为有效的字符(大概类似于 dddd.dd)。

一般性评论:将货币值存储为整数,否则最终可能会出现可怕的舍入问题。不要相信我的话,只是谷歌它。

【讨论】:

  • +1 表示“不要使用浮点数来赚钱”。使用 BigDecimal。
  • 感谢您的回复。 “显而易见的解决方案是检查字符串是否仅包含您认为有效的字符(大概类似于 dddd.dd)。”有没有一种方法可以用来做到这一点?
  • 看看 NumberFormat 类。基本上创建一个您认为有效的 NumberFormat 并使用它来解析您的字符串。如果解析器失败,则字符串无效。
猜你喜欢
  • 1970-01-01
  • 2022-01-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-06-25
  • 1970-01-01
相关资源
最近更新 更多