库存管理系统中登录验证中出现的问题

在库存管理系统的代码中出现了连接数据库进行查询时的错误,报空指针异常。

Dao包中的部分代码如下

protected static String dbClassName = "com.microsoft.sqlserver.jdbc.SQLServerDriver";
    protected static String dbUrl = "jdbc:sqlserver://localhost:1433; DatabaseName=db_JXC";
    protected static String dbUser = "sa";
    protected static String dbPwd = "han12345"; 
    protected static String second = null;
    public static Connection conn = null;
    static {
        try {
                Class.forName(dbClassName);
                } catch (Exception e) {
                e.printStackTrace();
                }
                try {
                // 与数据库连接
                Connection  conn = DriverManager.getConnection(dbUrl, dbUser, dbPwd);
                } catch (Exception e1) {
                e1.printStackTrace();
                }
    }

public static TbUserlist getUser(String name, String password) {
        //创建一个新的用户表对象
        TbUserlist user = new TbUserlist();
        //通过name查询用户信息,语句在
        ResultSet rs = findForResultSet("select * from tb_userlist where username='"+ name + "'");
        try {
            //这里出现空指针异常
            if (rs.next()) {
                //将表中读取到的信息传递到TbUserlist中用于后面的验证
                user.setUsername(name);
                user.setPass(rs.getString("pass"));
                if (user.getPass().equals(password)) {
                    user.setName(rs.getString("name"));
                    user.setQuan(rs.getString("quan"));
                }
            }
        } catch (SQLException e) {
            e.printStackTrace();
        }
        return user;
    }


public static ResultSet findForResultSet(String sql) {
        if (conn == null)
            return null;
        long time = System.currentTimeMillis();
        ResultSet rs = null;
        try {
            Statement stmt = null;
            //该常量指示可滚动但通常不受result底层数据更改影响的result对象的类型,不可更新的resultset对象的类型  
            stmt = conn.createStatement(ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY);
            //执行sql语句,通过name查询用户信息
            rs = stmt.executeQuery(sql);
            //时间
            second = ((System.currentTimeMillis() - time) / 1000d) + "";
        } catch (Exception e) {
            e.printStackTrace();
        }
        return rs;
    }

Login类中的部分代码如下

public void actionPerformed(final ActionEvent e) {
                //从数据库中获取用户
                user = Dao.getUser(userName.getText(), userPassword.getText());
                //如果用户或者密码为空的话将两个文本框置为NULL
                if (user.getUsername() == null || user.getName() == null) {
                    userName.setText(null);
                    userPassword.setText(null);
                    return;
                }
                setVisible(false);
                new KCFrame();
            }
        });

调试的时候出现空指针异常,经过几次查找与修改之后代码修改如下

protected static String dbClassName = "com.microsoft.sqlserver.jdbc.SQLServerDriver";
    protected static String dbUrl = "jdbc:sqlserver://localhost:1433; DatabaseName=db_JXC";
    protected static String dbUser = "sa";
    protected static String dbPwd = "han12345"; 
    protected static String second = null;
    public static Connection conn = null;

    public static void MyConn()
    {
         try {
                Class.forName(dbClassName);
                } catch (Exception e) {
                e.printStackTrace();
                }
                try {
                // 与数据库连接
                 conn = DriverManager.getConnection(dbUrl, dbUser, dbPwd);
                System.out.println("连接成功");
                } catch (Exception e1) {
                e1.printStackTrace();
                }
    }

在这里将数据库的连接单独创建了一个方法
并且将
Connection conn = DriverManager.getConnection(dbUrl, dbUser, dbPwd);
改为
conn = DriverManager.getConnection(dbUrl, dbUser, dbPwd);
将Connection 去掉,这里带Connection 的话就是局部变量了,在后面连接依然为null

public void actionPerformed(final ActionEvent e) {
                Dao.MyConn();
                //从数据库中获取用户
                user = Dao.getUser(userName.getText(), userPassword.getText());
                //如果用户或者密码为空的话将两个文本框置为NULL
                if (user.getUsername() == null || user.getName() == null) {
                    userName.setText(null);
                    userPassword.setText(null);
                    return;
                }
                setVisible(false);
                new KCFrame();
            }
        });

在这个Login类中的这个监听器中获取用户信息之前调用了Dao类中的MyConn()方法创建数据库的连接。

猜你喜欢

转载自blog.csdn.net/u012580143/article/details/72022651