2012-03-24 3 views
0

Хорошо, у меня есть этот код, который запрашивает ввод для имени пользователя и пароля. Я использовал JOptionPane. Я хочу, чтобы программа отображала сообщение об ошибке, если на входе в поле имени пользователя есть номер, и возвращается к предыдущему диалоговому окну с повторным запросом имени пользователя. У меня есть цикл while, но он не работает так, как должен. Пожалуйста, помогите. Программа не отображает сообщение об ошибке в моем методе catch, и он также не зацифровывает диалоговое окно для отображения.не зацикливается и отображает сообщение об ошибке

public class SwingExercise { 

public static void main(String[] args) { 

    String name = ""; 
    String pw = ""; 
    boolean input = true; 
    boolean hasDigit = false; 

    while (input) { 
    try { 
     while (name.equals("")) { 
     name = JOptionPane.showInputDialog(null, "Enter username:"); 
     if (name.equals("")) { 
      JOptionPane.showMessageDialog(
       null, "No input.", "Error", JOptionPane.ERROR_MESSAGE); 
      name = ""; 
     } 
     while (hasDigit) { 
      for (int i = 0; i < name.length(); i++) { 
      if (Character.isDigit(name.charAt(i))) { 
       throw new InputMismatchException(); 
      } 
      } 
      hasDigit = false; 
     } 
     } 
     input = false; 

     while (pw.equals("")) { 
     pw = JOptionPane.showInputDialog(null, "Enter password:"); 
     if (pw.equals("")) { 
      JOptionPane.showMessageDialog(
       null, "No input.", "Error", JOptionPane.ERROR_MESSAGE); 
      pw = ""; 
     } 
     } 
    } catch (NullPointerException e) { 
     System.exit(0); 
    } catch (InputMismatchException e) { 
     JOptionPane.showMessageDialog(
      null, "Invalid input.", "Error", JOptionPane.INFORMATION_MESSAGE); 
    } 
    } 
} 

Просьба указать любые комментарии относительно других строк в моем коде и если есть лишние строки. Заранее спасибо :)

+0

Я отформатировал ваш код для стиля, поэтому его легче читать. (Никаких изменений, кроме пробелов.) –

ответ

0

Одна из проблем заключается в том, что значение hasDigit всегда останется ложным. Вероятно, вы захотите определить hasDigit как истинный изначально.

boolean hasDigit = true; 
+0

О да, извините. не видел этого. Я редактировал его слишком много. :)) В любом случае теперь отображается сообщение об ошибке, однако оно переходит к диалоговому окну пароля. Я хотел, чтобы он вернулся к диалоговому окну. – Layne

+0

Ну, задайте имя = "" в блоке catch, и он это сделает. –

+0

Спасибо! Это сработало. :) Я просто знаком с Java, поэтому я задаю эти вопросы. Спасибо за помощь :) – Layne

1

Там вроде бы Absolutley никакого способа, чтобы попасть в петлю while(hasDigit), потому что вы его установить на false, и нет установки его true ничего.

+1

@adam liss вы отредактировали это 4 года спустя? LOL <3 – Lucas

+1

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

0

Некоторые замечания по стилю, так как вы просили:

  • В общем, вы хотите, чтобы ваши try() блоки, чтобы быть как можно короче, так что ясно, какие строки вы ожидаете бросить исключение. В противном случае вы можете неожиданно поймать исключение из строки, которую, по вашему мнению, не могли бы сгенерировать, а затем обработать ее неправильно. Это означает, что код, вероятно, будет длиннее, но гораздо более важно, чтобы его было легче поддерживать и отлаживать.

  • Когда законно для строки null, принято писать if ("".equals(name)), а не if (name.equals("")). Так как жестко закодированная пустая строка никогда не может быть null, вам не нужно окружать код блоком try/catch.

  • Там нет необходимости устанавливать name или pw в пустую строку внутри if(), который проверяет, чтобы увидеть, если они пусты.

  • Возможно, вы не хотите повторять пароль. См. JOptionPane to get password.

  • Код явно запрещает цифры в name, но принимает все остальные символы, включая знаки препинания и специальные символы. В целом хорошая практика программирования для использования белого списка приемлемого ввода, а не черный список запрещенного ввода. Таким образом, вы никогда не будете удивлены недействительными данными, которые неожиданно приняты.

  • Отвод while() завершается, если пароль недействителен, так как input зависит только от name. Лучше установить input в false в верхней части цикла, а затем установить его на true, если какой-либо вход недействителен.

  • Поскольку блоки name и pw почти идентичны (они запрашивают непустую строку), рассмотрите возможность их извлечения в вспомогательную функцию.Вы захотите передать параметры, которые задают приглашение, и не следует ли повторять вход обратно пользователю.

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