не зацикливается и не отображает сообщение об ошибке - PullRequest
0 голосов
/ 24 марта 2012

Хорошо, у меня есть этот код, который запрашивает ввод имени пользователя и пароля.Я использовал 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);
    }
  }
}

Пожалуйста, упоминайте любые комментарии относительно других строк в моем коде и, еслиЕсть какие-то ненужные строки.Заранее спасибо:)

Ответы [ 3 ]

1 голос
/ 24 марта 2012

Кажется, что нет абсолютно никакого способа попасть в цикл while(hasDigit), потому что он установлен на false, и ничто не может установить его на true.

0 голосов
/ 02 апреля 2016

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

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

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

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

  • Возможно, вы не хотите выводить пароль.См. JOptionPane для получения пароля .

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

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

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

0 голосов
/ 24 марта 2012

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

boolean hasDigit = true;
...