Java 循环解析Double.IsNaN时出错

Java 循环解析Double.IsNaN时出错,java,parsing,double,nan,Java,Parsing,Double,Nan,语言:Java,IDE:EclipseMars 程序应该提示用户(使用JOptionPane)输入正值。我正在试图捕捉无效的条目。我的while语句捕捉负数,但不捕捉字符串。当输入负数时,将再次显示提示,但当输入字符串值时,将捕获异常并继续运行程序(当程序应重新提示用户时) 输入正值后,程序将其分配给另一个类中的值。(我们正在学习MVC OOP设计模式) Double.isNaN(Double.parseDouble(h))-->有人能帮我找到我缺少的东西吗 // prompt to get b

语言:Java,IDE:EclipseMars

程序应该提示用户(使用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());
    }
//提示从用户获取带宽
//检查有效性
//如果无效,请再次提示
试一试{
h=JOptionPane.showInputDialog(“将带宽输入为正数”);
//循环,直到解析的字符串为有效的双精度

while(Double.isNaN(Double.parseDouble(h))| | Double.parseDouble(h)这是因为
parseDouble()的工作原理

抛出:

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

()

因此,如果字符串不是double,
parseDouble()
将不会返回NaN,而是抛出异常,这意味着您的catch子句将被调用


要解决这个问题,可以使用递归算法,如果抛出异常,该算法将再次调用您的方法。

正如前面所述,您需要在
循环中移动
try
/
catch

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

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;
}
public Foo getUserInput(){
Foo结果;
做{
试一试{
字符串s=requestUserInput();//类似于Scanner.nextLine()的内容
result=parseUserInput(s);//类似于Double.parseDouble(字符串)
}
捕获(异常exc){
//也许你也想告诉用户这里发生了什么
继续;
}
}
while(!isValid(result));//类似于(0
尝试将输入直接解析为双精度,并注意异常情况。
try/catch
需要在
while
循环中。@ΦXocę웃Пepeúpaツ NaN通常用于表示无穷大值。不是真的。正无穷大和负无穷大有不同的值。