String.length() дает мне неправильное значение

Всякий раз, когда я ввожу пароль менее 10 символов, он дает мне Password cannot exceed 10 characters.

private void jButton5ActionPerformed(java.awt.event.ActionEvent evt) {                                         
        String name = Name.getText();
        String Username = uName.getText().toString();
        String Pass1 = uPass.getPassword().toString();
        String Confirm = uConfirm.getPassword().toString();
        String Status = "OFFLINE";
        int PassLen = Pass1.length();

        if (Username.equals("") || Pass1.equals("") || Confirm.equals("") || name.equals("")) 
        {
            JOptionPane.showMessageDialog(null, "You cannot leave any fields blank when creating an Account. Please Try Again");
        } 
        else if ((uPass.getPassword().toString()).length()>10)
        {
            uPass.setText("");
            uConfirm.setText("");
            JOptionPane.showMessageDialog(null, "Password cannot exceed a maximum of 10 characters.");  
        }
        else if (!Pass1.equals(Confirm))
        {
            uConfirm.setText("");
            lblError1.setText("Passwords Do Not Match.");
            lblError2.setText("Please re-enter your Password.");
        }
        else
        {
            try {
                DB_Connect connect = new DB_Connect();
                ResultSet rs = connect.queryTbl("SELECT * FROM ACOUNTS");
                boolean AlreadyUser = false;
                String User;
                while (rs.next())
                {
                    User = rs.getString("Username");
                    if(Username.equals(User))
                    {
                        AlreadyUser = true;
                    }
                }
                if (AlreadyUser==false)
                {
                    connect.updateTbl("INSERT INTO NBUSER.ACCOUNTS (USERNAME,PASSWORD,STATUS,NAME)VALUES ('"+Username+"','"+Pass1+"','"+Status+"','"+name+"')");
                    JOptionPane.showMessageDialog(null, "Account Created Successfully !");
                    this.dispose();
                    new Topics().setVisible(true);
                }
                else
                {
                    JOptionPane.showMessageDialog(null, "The Username you have selected already exists. Please select a different Username");
                    uPass.setText("");
                    uConfirm.setText("");
                }
            } catch (SQLException ex) {
                Logger.getLogger(CreateAccount.class.getName()).log(Level.SEVERE, null, ex);
            }

        }


    }                                        

person Edge    schedule 18.10.2015    source источник
comment
Что возвращает uPass.getPassword()? Возможно, он возвращает экземпляр некоторого класса, чей метод toString не возвращает строку пароля.   -  person Eran    schedule 18.10.2015
comment
Пробовали ли вы распечатать значения ваших объектов, чтобы увидеть, что на самом деле содержит?   -  person code_dredd    schedule 18.10.2015
comment
Откройте отладчик и отобразите значение uPass.getPassword().toString()).   -  person Marged    schedule 18.10.2015
comment
Кроме того, почему вы используете uPass.getPassword().toString(), когда вы могли просто использовать Pass1. Помните, СУХОЙ.   -  person Mr Lister    schedule 18.10.2015
comment
Что uPass.getPassword() возвращает?   -  person Rehman    schedule 18.10.2015
comment
Если getPassword() возвращает char[], правильный способ превратить его в строку, насколько я знаю, это String(getPassword()), а не .toString().   -  person Mr Lister    schedule 18.10.2015
comment
Прокомментируйте качество кода. Вы постоянно нарушаете не только DRY (не повторяйтесь), но и SLR (один слой абстракции) и SRP (принцип единой ответственности). Короче говоря: подумайте также о том, чтобы научиться писать хороший код. Идеальный ресурс для начала — «Чистый код» Роберта Мартина; которые вы можете найти в Интернете.   -  person GhostCat    schedule 18.10.2015


Ответы (1)


Поскольку вы, очевидно, используете Swing, также весьма вероятно, что вы используете JPasswordField для ваших паролей. Итак, давайте посмотрим, что getPassword действительно:

public char[] getPassword()

Возвращает текст, содержащийся в этом TextComponent. Если базовый документ имеет значение null, будет выдано исключение NullPointerException. Для большей безопасности рекомендуется очищать возвращаемый массив символов после использования, устанавливая каждый символ равным нулю.

Возвращает: текст

Как видите, он возвращает ваш пароль в виде char[], и, поскольку этот класс не переопределяет toString, ваш вызов uPass.getPassword().toString() приводит к чему-то вроде:

[C@1d44bcfa

который является результатом вызова Object#toString.

Длина этой строки равна 11 и, следовательно, больше 10, и будет введен ваш блок else if (else if ((uPass.getPassword().toString()).length()>10)).

Чтобы это исправить, вызовите конструктор String String(char[]) например:

String Pass1 = new String(uPass.getPassword());

Пожалуйста, используйте это просто как «быстрое решение» для вашей текущей проблемы и попытайтесь найти способ использовать первоначально возвращенный файл char[]. Как упоминалось в цитируемом JavaDoc, рекомендуется «очистить» массив символов после его использования, поэтому пароль больше не будет там храниться. Создавая String из массива, используя new String(uPass.getPassword()), вы создаете еще один объект в куче, который содержит пароль и который тоже нужно оттуда удалить. Так это добавит вам работы.

person Tom    schedule 18.10.2015
comment
Часть о наличии пароля в стеке неверна в контексте Java. Даже в других языках область действия переменной не обязательно определяет место хранения ее содержимого (например, стек или куча в C/C++). - person code_dredd; 18.10.2015
comment
Большое спасибо! Очень быстрое время отклика! - person Edge; 18.10.2015
comment
@ray Да, это зависит от типа. Я удалил эту часть. - person Tom; 18.10.2015
comment
@Tom: это не зависит от типа. Это зависит от того, используется ли оператор new или нет. Последняя часть вашего сообщения все еще неточна. - person code_dredd; 18.10.2015
comment
@ray Верно, потому что new String(uPass.getPassword()) не использует оператор new. - person Tom; 18.10.2015
comment
@Tom: getPassword возвращает char[]. char[] будет выделен с помощью оператора new, что означает, что он находится в куче. Для всех практических целей все объекты Java хранятся в куче. (Если это не так, это деталь оптимизации/реализации JVM, которую никто не должен предполагать или полагаться. См. здесь) - person code_dredd; 18.10.2015
comment
@ray Я этого не отрицал. Я сказал, что он не должен создавать дополнительный (хотя я и пропустил это конкретное слово) объект в куче с этим паролем. - person Tom; 18.10.2015
comment
@ray Я обновил ответ, чтобы более подробно объяснить, что я имею в виду. Надеюсь, это не вызовет больше недоразумений. - person Tom; 18.10.2015