对象引用返回null Java

时间:2014-03-26 13:16:33

标签: java mysql object

我正在使用MySQL运行一个简单的Java登录系统。

登录工作正常,但我想创建一个通过get方法登录的用户对象。但是在输出这些方法时,它们返回null:

"使用null和null"。

登录

我做错了什么?

- 主要 -

public class Main {


public static void main(String[] args) {

    Scanner input = new Scanner(System.in);
    User u = new User();

    String username;
    String password;

    System.out.println("Enter Username: ");
    username = input.next();

    System.out.println("Enter Password: ");
    password = input.next();

    DatabaseController dc = new DatabaseController();
    dc.login(username, password);

    if(dc.a){
        System.out.print("Logged in with "+ u.getUsername()+ " and " +u.getPassword());
    }
    else{
        System.out.println("mismatch");
    }

}

}

- 数据库控制器---

public class DatabaseController {

private DatabaseConnection db;
ResultSet rs;
boolean a;
User u = null;

String name;
String pass;

public DatabaseController()
{
    db = new DatabaseConnection();
}

public boolean login(String username, String password)
{

    try
    {
        rs = db.doQuery("SELECT Firstname, Password FROM Users WHERE Firstname ='"+ username+"';");
        while(rs.next())
        {
            name = rs.getString(1);
            pass = rs.getString(2);
            if(pass.equals(password)){
                a = true;
                u = new User();
                u.setPassword(password);
                u.setUsername(username);
            }
        }
    }
    catch(Exception ex)
    {
        ex.printStackTrace();
    }
    return a;
}
 }

--- USER ---

public class User {

private String username;
private String password;

public String getUsername() {
    return username;
}
public void setUsername(String username) {
    this.username = username;
}
public String getPassword() {
    return password;
}
public void setPassword(String password) {
    this.password = password;
}

}

5 个答案:

答案 0 :(得分:4)

u是main中的一个局部变量,已分配但从不具有其内部数据集。您设置的u生活在DatabaseController。您需要dc.u。有些方法可以改进代码本身的最佳实践,其他人已经指出了,但这似乎超出了这个问题的范围。如果您希望帮助改进设计,请离线拍我留言。

现在让世界成为一个更安全的地方。切勿以纯文本格式存储密码。在存储密码时计算密码的哈希值(最好是Salted SHA256),然后在登录时比较哈希值。您还有一个SQL注入漏洞。您应该参数化该查询。尝试输入

' OR 1=1;-- 

作为任意密码的用户名,看看会发生什么。您目前正在通过在代码中进行密码比较来避免这种情况,但它仍应修复。

答案 1 :(得分:1)

你初始化你,但你永远不会初始化它的属性用户名和密码。将其添加到您的代码中:

u.setUsername(username); 
u.setPassword(password);

您的代码如下所示:

public class Main { 
    public static void main(String[] args) {

        Scanner input = new Scanner(System.in);
        User u = new User();

        String username;
        String password;

        System.out.println("Enter Username: ");
        username = input.next();

        System.out.println("Enter Password: ");
        password = input.next();

        u.setUsername(username); //set u.username
        u.setPassword(password); //set u.password

        DatabaseController dc = new DatabaseController();
        dc.login(username, password);

        if(dc.a){
            System.out.print("Logged in with "+ u.getUsername()+ " and " +u.getPassword());
        }
        else{
            System.out.println("mismatch");
        }

    }
}

编辑:

使用您在DatabaseController中定义的User u或main-method中的private。我认为其中一个是没有必要的。

此外,如果您尝试在此处实现与安全相关的功能,我建议您在DatabaseController {{1}}中声明所有属性(尤其是布尔值),并仅通过getter函数访问它。这样,没有其他类可以修改它。此外,您可能需要考虑将该类设为final,以便其他类不能继承它,从而更改其功能!

答案 2 :(得分:0)

不要从Main类分配用户名和密码。通过致电u.setUserName()u.getUserName()来设置它们。 您正在尝试访问新的User对象,因此它返回null。

答案 3 :(得分:0)

考虑一下为什么期望u.getUsername()非空。首先,您要创建一个用户实例:

User u = new User();

然后为某些本地usernamepassword变量分配一些值:

String username;
String password;

System.out.println("Enter Username: ");
username = input.next();

System.out.println("Enter Password: ");
password = input.next();

然后你正在调用一个只接受usernamepassword的登录方法:

DatabaseController dc = new DatabaseController();
dc.login(username, password);

最后,你打印出这条消息:

System.out.print("Logged in with "+ u.getUsername()+ " and " +u.getPassword());

此时,u只是一个新实例化的对象 - 您没有为其分配任何值,或者使用它完成任何工作 - 没有理由getUsername和{{ 1}}返回除getPassword之外的任何内容的方法。也许您希望null方法返回login个实例,而不是返回User

答案 4 :(得分:0)

您正在返回一个布尔变量,该变量告诉登录过程是否成功。但要获取用户详细信息,您应该从登录过程返回用户。

// login method return the user when successful login happens otherwise null
public User login(String username, String password){

return u;
}

// get the user return by login process, if u is null then login fail otherwise login pass and show details
u = dc.login(username, password);