而循环解析Double.IsNaN不当(while loop parsing Double.IsNa

2019-09-28 23:36发布

语言:Java IDE的:月蚀

该方案被认为提示用户(使用的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());
    }

Answer 1:

这是因为如何parseDouble()的作品。

抛出:

NumberFormatException - 如果字符串不包含可解析的两倍。

( 见这里 )

因此,如果字符串不是双parseDouble()将不会返回NaN的,但抛出一个异常,这意味着你的catch子句就会被调用。

为了解决这个问题,也许使用递归算法,如果抛出一个异常,这将再次拨打您的方法。



Answer 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;
}


文章来源: while loop parsing Double.IsNaN improperly