2017-02-07 19 views
1

извлечения незаконного Языка: Java, IDE: затмение Марсав то время как цикл разбор Double.IsNaN

программа должна запрашивать у пользователя (с помощью 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()); 
    } 
+0

попытаться разобрать вход непосредственно в качестве двойного и быть в курсе, за исключение ... –

+1

'попробовать/catch' должен находиться внутри цикла while. – 4castle

+1

@ ΦXocę 웃 Пepeúpa ツ * NaN обычно представляет бесконечные значения. * Не совсем. Существуют отдельные значения для положительной и отрицательной бесконечности. – shmosel

ответ

1

Это из-за того, как работает parseDouble().

Броски:

NumberFormatException - если строка не содержит интерпретируемые дважды.

(See here)

Таким образом, если строка не является двойной parseDouble() не возвращает NaN, но бросить исключение, которое означает, что ваш пункт улов будет называться.

Для решения этой проблемы, возможно, используйте рекурсивно алгоритм, который снова вызовет ваш метод, если будет создано исключение.

1

Как уже указывалось, вам необходимо переместить ваш блок 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; 
}