【问题标题】:while loop parsing Double.IsNaN improperlywhile 循环解析 Double.IsNaN 不正确
【发布时间】:2017-06-25 01:22:33
【问题描述】:

语言:Java,IDE:eclipse mars

程序应该提示用户(使用 JOptionPane)输入一个正值。我正在尝试捕获无效条目。我的 while 语句捕获负数但不捕获字符串。当输入负数时,再次显示提示,但当输入字符串值时,异常被捕获,程序继续运行(当它应该重新提示用户时)。

输入正值后,程序会将其分配给另一个类中的值。 (我们正在学习 MVC OOP 设计模式)。

Double.isNaN(Double.parseDouble(h)) ---> 谁能帮我找出我遗漏了什么?

// prompt to get bandwidth from user
// check for validity
// if invalid, prompt again
try{
    h = JOptionPane.showInputDialog("Enter bandwidth as a positive number");
        // loop until parsed string is a valid double
    while (Double.isNaN(Double.parseDouble(h)) || Double.parseDouble(h) <=0)  {
            h = JOptionPane.showInputDialog("Enter bandwidth as a positive number");
        }
        // h has been set to valid double, set it to bandwidth
        model.setBandwidth(Double.parseDouble(h));  
    }catch(NumberFormatException|NullPointerException NFE){
        System.err.println("Caught exception: " + NFE.getMessage());
    }

【问题讨论】:

  • 尝试将输入直接解析为双精度并注意异常...
  • try/catch 需要在 while 循环内。
  • @ΦXocę웃Пepeúpaツ NaN 通常用于表示无限值。 并非如此。正无穷和负无穷有不同的值。

标签: java parsing double nan


【解决方案1】:

这是因为parseDouble() 的工作原理。

投掷:

NumberFormatException - 如果字符串不包含可解析的双精度。

(See here)

所以如果 String 不是双精度 parseDouble() 将不会返回 NaN 而是抛出异常,这意味着你的 catch 子句将被调用。

为了解决这个问题,可以使用递归算法,如果抛出异常,它会再次调用你的方法。

【讨论】:

    【解决方案2】:

    正如4castle 所述,您需要将try/catch 块移动到while 循环内。

    但是,为了验证用户输入,您基本上可以坚持以下模式:

    public Foo getUserInput() {
        Foo result;
        do {
            try {
                String s = requestUserInput(); // something like Scanner.nextLine()
                result = parseUserInput(s); // something like Double.parseDouble(String)
            }
            catch(Exception exc) {
                // maybe you want to tell the user what's happened here, too
                continue;
            }
        }
        while(!isValid(result)); // something like (0 < result)
        return result;
    }
    

    【讨论】:

      猜你喜欢
      • 2013-01-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-05-03
      • 1970-01-01
      • 2016-08-17
      相关资源
      最近更新 更多