Как исправить только последнюю строку массива, проверяемую на имя пользователя и пароль при чтении из файла

Я читаю имена пользователей из файла csv в формате

admin1, apple,  admin
staff1, orange, staff

когда staff1 находится на новой строке, и независимо от того, сколько строк у меня есть, при входе в систему будет проверяться только последняя строка.

        AtomicBoolean found = new AtomicBoolean(false);

   btnLogin.setOnAction(e -> {
        while (in.hasNextLine()) {


            String s = in.nextLine().replaceAll("\\s+", "");





                if (name.equals(sArray[0]) && password.equals(sArray[1])) {
                    lMessage.setText("correct");
                    openMainForm();


                } else if (name.equals("") || password.equals("")) {
                    lMessage.setText("Please enter a username and password");


                } else {
                    lMessage.setText("Please enter valid credentials");



                }




            }


        });

Я ожидаю, что если в файле будет найдена комбинация имени пользователя и пароля, они смогут войти в систему, а не только в том случае, если имя пользователя и пароль являются последними во времени.

Вы перезаписываете действие, которое будет выполняться при нажатии кнопки для каждой из строк, только последнее определенное вами действие будет выполняться при нажатии кнопки.

Aaron 10.04.2019 15:19

Кроме того, я бы поместил цикл while внутри обработчика setOnAction.

Kartik Soneji 10.04.2019 15:21

Самый простой способ - перебрать содержимое файла внутри функции, которая передается setOnAction, как предложил Картик Сонеджи: вызвать setOnAction один раз (вне цикла), но сделать то, что он делает, один раз в строке вместо единственный раз

Aaron 10.04.2019 15:27
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
0
3
76
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Проблема в том, что вы устанавливаете действие в цикле. То есть один объект действия создается для каждой пары, а затем назначается. Таким образом, после последней итерации действие будет установлено на последний объект, который, очевидно, проверяет последнюю пару имени пользователя и пароля.

петля переводится как что-то вроде,

setOnAction(actionobject1 that checks for admin1, apple, admin)

setOnAction(actionobject2 that checks for staff1, orange, staff)

Это эффективно сохраняет последний созданный объект и проверяет только последнюю пару

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

Что-то вроде этого:

btnLogin.setOnAction(e -> {

     while (in.hasNextLine() ) {
        // check condition here
        // don't forget to break when successful

      }
        in.close();
    });

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

Комментарии не для расширенного обсуждения; этот разговор был перешел в чат.

Samuel Liew 12.04.2019 01:48

Другие вопросы по теме