2017-02-07 12 views
1

言語解析中:Java(登録商標)、IDE:プログラムが正の値のため(のJOptionPaneを使用して)ユーザを促すことになっている火星ループはDouble.IsNaN不適切

日食。私は無効なエントリをキャッチしようとしています。私の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()); 
    } 
+0

はdoubleとして直接入力を解析し、例外を認識するようにしてみてください... –

+1

'てみてください/ catch' 'while'ループの中にいる必要があります。 – 4castle

+1

@ NaNは、通常、無限の値を表現するためのものです。正と負の無限大には別々の値があります。 – shmosel

答えて

1

これはparseDouble()がどのように機能するかによるものです。

例外:

はNumberFormatExceptionを - 文字列が解析可能な二重が含まれていない場合。

See here

文字列がないのであれば、二重parseDouble()あなたのcatch節が呼び出される意味は、NaNを返すが、例外をスローしません。

この問題を解決するには、例外がスローされた場合に再度メソッドを呼び出す再帰的アルゴリズムを使用してください。

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