Проблема в том, что ваш цикл while закодирован неверно, так как ваш блок «Ошибка входа» JOptionPane else не должен находиться в цикле while.Вместо этого объявите логическое значение перед циклом, установите его в false, проверьте, найдены ли имя пользователя / пароль в этом цикле, и, если так, установите логическое значение в true.Затем после цикл проверяет логическое значение и, если false, показывает сообщение об ошибке.
Чтобы понять почему, используйте отладчик для запуска кода, чтобы понять, почему он ведет себя так, как он себя ведет.Что еще более важно, изучите технику отладки «резиновой утки», когда вы мысленно или на бумаге просматриваете свой код, рассказывая утке, что должна делать каждая строка кода.
Чтобы проиллюстрировать, ваш код ведет себя примерно так:код ниже, где логический массив имитирует проверку вашего пароляКонечно, вы будете использовать цикл while, а не цикл for, но здесь он был использован для упрощения примера:
private someActionPerformedMethod() {
// boolean representing when the username/password test is OK
boolean[] loopItems = { false, false, false, true, false };
for (boolean loopItem : loopItems) {
if (loopItem) {
break;
} else {
JOptionPane.showMessageDialog(null, "Login failed");
}
}
}
Предположим, что пароль / имя пользователя совпадает только с 4-й попытки (четвертый элемент - true
), затем для каждой неудачной проверки JOptionPane будет отображать неудачный вход в систему.Вместо этого вы хотите что-то вроде:
private someActionPerformedMethod() {
// boolean representing when the username/password test is OK
boolean[] loopItems = { false, false, false, true, false };
boolean userFound = false;
// you'll of course be using a while loop here
for (boolean loopItem : loopItems) {
if (loopItem) {
userFound = true;
// do something with user data
break;
}
}
if (!userFound) {
JOptionPane.showMessageDialog(null, "Login failed");
}
}