2015-02-24 2 views
1

У меня есть цикл for, который используется для сравнения данных для входа пользователя для запуска следующего экрана приложения.Как выполнить блок else только один раз в цикле for

Если введенные пользователем поля успешно совпадают с данными в ArrayList, возвращаемом из базы данных, программа запускает следующий экран - если они не совпадают, сообщение об ошибке выводится пользователю с использованием JOptionPane.

Моя проблема - выводится сообщение об ошибке для каждой итерации цикла for, но я хочу, чтобы сообщение отображалось только один раз.

//if name or password are NOT left blank proceed with the check otherwise output error message in the text area 
    if (!name.equals("") && !password.equals("")) { 
     for (int i = 0; i < passwords.size(); i++) { 
      if (name.equals(userNames.get(i)) && (password.equals(passwords.get(i)))) { 
       myHomeGUI.setVisible(true); 
       break; 
      } else { 
       JOptionPane.showMessageDialog(null,"Sorry, no user recognized with those credentials\nPlease try again"); 
      } 
     }//end for loop 
    } else { 
     JOptionPane.showMessageDialog(null,"Sorry, no fields can be left blank"); 
    }//end 
+2

Итак, добавьте оператор break после сообщения; – OldProgrammer

+0

попробовал это, если у меня есть оператор break после сообщения в другом, что он не будет работать. Например, если 3-я позиция моего arraylist для userNames - это david, и пользователь вводит john, который не находится в списке массивов, он вырвется из цикла и никогда не достигнет давида и поэтому никогда не будет оценивать значение True – RoRo88

+0

. Я бы подумал об изменении имени пользователя/паролей. Почему у вас есть два списка? не было бы лучше иметь (например) карту (Hash) с именем пользователя/паролем в ней? Тогда вам не нужно проходить через петлю. просто сравните пароль с map.get (username) – griFlo

ответ

5

Это происходит потому, что вы положили в вашем loopelse condtion, который выполняется в каждом Iteration

Попробуйте это:

boolean isValid=false; 
for (int i = 0; i < passwords.size(); i++) { 
      if (name.equals(userNames.get(i)) && (password.equals(passwords.get(i)))) { 
       myHomeGUI.setVisible(true); 
       isValid=true; 
       break; 
      } 
}//end for loop 
if(!isValid) { 
JOptionPane.showMessageDialog(null,"Sorry, no user recognized with those credentials\nPlease try again"); 
} 

Update

Как предложил @Joelblade, вы также может передавать эту логику аутентификации в отдельный Метод тэ

public boolean isAuthenticationPassed(String userName,String password){ 
       return true; // When Login Successfull 
       or 
       return false; // When Login unsuccessfull 
    } 

затем проверить в вашем LoginController

if(isAuthenticationPassed){ 
    // Do whatever you want to do 
} 
else{ 
//Return to Login Page with error/or show Dialog Box 
} 
+0

. Это в значительной степени структура, которую я бы использовал. Вы можете даже переместить цикл whole в цикл (boolean authenticateUser (имя, пароль)) и выполните: if (! AuthenticateUser (имя, пароль)) – Joeblade

+0

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

0

Как указано выше в комментарии: Вы также можете использовать карту вместо двух списков

Map<String,String> map = new HashMap<String,String>(); 
    map.put("john", "1234"); 
    map.put("test", "asdf"); 

    String name = "test"; 
    String password = "asdf"; 


    //if name or password are NOT left blank proceed with the check otherwise output error message in the text area 
    if (!name.equals("") && !password.equals("")) { 

      if(map.get(name)!=null && map.get(name).equals(password)) 
       myHomeGUI.setVisible(true); 
       break; 
      } else { 
       JOptionPane.showMessageDialog(null,"Sorry, no user recognized with those credentials\nPlease try again"); 
      }   
    } else { 
     JOptionPane.showMessageDialog(null,"Sorry, no fields can be left blank"); 

    }//end 
+0

Никогда не следует раскрывать пароли (или другую конфиденциальную/конфиденциальную информацию), как это в исходном коде. Это плохая практика –

+0

Вы, конечно, абсолютно правы! RoRo88 ранее не использовал карту, поэтому я просто хотел, чтобы он показывал, как вы вставляете данные. – griFlo

0

Если вы реорганизовать свой код до в более логичные части будет намного проще кодировать и понимать, например:

if (name.equals("") || password.equals("")) { 
    JOptionPane.showMessageDialog(null,"Sorry, no fields can be left blank"); 
} else if(doesUserExist(name, password)) { 
    myHomeGUI.setVisible(true); 
} else { 
    JOptionPane.showMessageDialog(null,"Sorry, no user recognized with those credentials\nPlease try again"); 
} 

// ... new method 

private boolean doesUserExist(String name, String password) { 
    for (int i = 0; i < passwords.size(); i++) { 
     if (name.equals(userNames.get(i)) && (password.equals(passwords.get(i)))) { 
      return true; 
     } 
    } 
    return false; 
} 
Смежные вопросы