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