2017-02-07 28 views
1

語言:Java中,IDE:日食火星while循環解析Double.IsNaN不當

程序應該提示用戶(使用的JOptionPane)爲正值。我試圖抓住無效的條目。我的聲明抓住了負數,但不是字符串。當輸入負數時,會再次顯示提示,但是當輸入字符串值時,將捕獲異常並且程序繼續運行(當它應該重新提示用戶時)。

一旦輸入正值,程序就會將它賦值給另一個類中的值。 (我們正在學習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()); 
    } 
+0

嘗試分析直接輸入爲雙並意識到異常的... –

+1

的'嘗試/ catch'需要在'while'循環中。 – 4castle

+1

@ΦXocę웃Pepeúpaツ* NaN通常代表無限值。*不是真的。正負值無窮大有單獨的值。 – shmosel

回答

1

這是因爲parseDouble()的工作原理。

拋出:

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

See here

所以如果字符串不是雙parseDouble()不會返回NaN的,但拋出一個異常,這意味着你的catch子句就會被調用。

要解決此問題,可能使用遞歸算法,如果拋出異常,它將再次調用您的方法。

1

由於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; 
}