2014-01-20 2 views
0

Я создаю программу на Java, используя eclipse. Программа задает ряд вопросов от пользователя и до тех пор, пока они не ответят правильно, она будет запрашивать их снова и снова, и после получения правильного ответа она сохранит ее в переменной для последующего использования. ниже мой код;Можно ли задавать серию вопросов без генерации большого количества кода?

int waitseconds; 
int favouritenumber; 
int hoursofsleep; 

do { 
    String waitsecondsR = JOptionPane.showInputDialog("How many seconds would you like to wait for out of 1 - 7?"); 
    waitseconds = Integer.parseInt(waitsecondsR); 
} 
while (waitseconds < 1 || waitseconds > 10); 

do { 
    String favouritenumberR = JOptionPane.showInputDialog("What is your favourite number out of 1 and 2?"); 
    favouritenumber = Integer.parseInt(favouritenumberR); 
} 
while (favouritenumber < 1 || favouritenumber > 2); 

do { 
    String hoursofsleepR = JOptionPane.showInputDialog("How many hours do you sleep for? between 1-8?"); 
    hoursofsleep = Integer.parseInt(hoursofsleepR); 
} 
while (hoursofsleep < 1 || hoursofsleep > 8); 

Это первые три утверждения/вопросы, которые у меня есть, которые пользователь должен ответить, и я, вероятно, в конечном итоге, как 10-12 из этих утверждений в одном классе, можно сделать это любой короче? а также у меня еще 2 вопроса.

  1. Возможно ли удержать пользователя от ответов на письма, и если да, то они предоставят им ошибки? например если там положить один вместо 1 или O, то программа должна попросить их снова ввести.

  2. с кодом, который у меня есть, когда вы запустите его Input Dialog, и там пользователь должен ввести ответ, но если пользователь нажимает кнопку «Отменить» или «Перекреститься» вверху, тогда java отображает сообщения об ошибках в консоли, как я могу остановить это? как это;

Исключение в потоке "АВТ-EventQueue-0" java.lang.NumberFormatException: нуль в java.lang.Integer.parseInt (Unknown Source) в java.lang.Integer.parseInt (Неизвестный источник) на ExpressTrain.ExpressTrain (ExpressTrain.java:46) на GUIDesign.Express (GUIDesign.java:149) в GUIDesign $ 1.actionPerformed (GUIDesign.java:80) в javax.swing.AbstractButton.fireActionPerformed (Неизвестный источник) at javax.swing.AbstractButton $ Handler.actionPerformed (Неизвестный источник) в javax.swing.DefaultButtonModel.fireActionPerformed (Unknown Source) в javax.swing.DefaultButtonModel.setPressed (Unknown Source) в javax.swing.plaf.basic.BasicButtonListener.mouseReleased (Неизвестный источник) в java.awt. AWTEventMulticaster.mouseReleased (Unknown Source)

и больше ....

ответ

0

Создайте метод для этого.

private static int askIntQuestion(String question, int min, int max) { 
    int n = min - 1; 
    do { 
     try { 
      String input = JOptionPane.showInputDialog(question); 
      n = Integer.parseInt(input); 
     } catch (NumberFormatException e) { 
     } 
    } while (n < min || n > max); 
    return n; 
} 

А потом звонить с:

int waitseconds = askIntQuestion("How many seconds would you like to wait for out of 1 - 7?", 1, 7); 

Как вы уже знаете, do-while заставляет допустимый диапазон. Теперь try-catch имеет целью захват исключений, которые отображаются в консоли, когда вход не является числом или когда просто нет ввода. Переменная n инициализируется min - 1, чтобы гарантировать, что она не выйдет из цикла, если задан нечисловой ввод. Наконец, включение всего этого в метод делает его намного проще использовать снаружи, как вы видите при вызове.

Если вы хотите, вы можете изменить код, чтобы сообщить пользователю, когда он вводит что-то плохое:

private static int askIntQuestion(String question, int min, int max) { 
    while (true) { 
     try { 
      String input = JOptionPane.showInputDialog(question); 
      int n = Integer.parseInt(input); 
      if (n >= min && n <= max) return n; 
     } catch (NumberFormatException e) { 
     } 
     JOptionPane.showInputDialog("You should input a number between " + min + " and " + max + "."); 
    } 
} 

Здесь нам не нужно трюк инициализации для min - 1, поскольку while гарантирует, что единственный способ для выхода находится команда return, что происходит только тогда, когда вход действителен. В противном случае отображается сообщение об ошибке и циклы.

0

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

Теперь, если у вас есть определенная логика проверки, у вас есть немного кода для записи, чтобы убедиться, что у вас есть правильная проверка правильного вопроса, но я бы предположил, что это будет что-то вроде линии этого:

BOUND 1,8 How many hours do you sleep for? between 1-8? 

... с enum от типа ограничения вы имеете в файле, ограничения, разделенных запятой, и сам вопрос.

Я не буду разрабатывать это решение для вас, но я настоятельно рекомендую вам придумать то, что вам подходит и ваше понимание Java лучше.

Далее, способ, которым работает Integer#parseInt(), заключается в том, что он попытается проанализировать ввод как целое число или взорвать небо высоко, если оно не является дистанционно цифровым (то есть "$").

Это взорвав на самом деле легко восстановить из - вы можете использовать try...catch заявление , чтобы оправиться от этого метода неисправного преобразовать вход на Integer, и бесконечный цикл, чтобы просить для ввода, если ответ ISN «т корректно распознан:

while(true) { 
    try { 
     Integer waitseconds = Integer.parseInt(JOptionPane.showInputDialog("How many seconds would you like to wait for out of 1 - 7?")); 
     if(waitseconds < 1 || waitseconds > 10) { 
      break; 
     } 
    } catch (NumberFormatException nfe) { 
     JOptionPane.showMessageDialog(null, "Invalid input; please try again."); 
    } 
} 

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

Смежные вопросы