linminggood的gravatar头像
linminggood 2016-04-18 22:39:25

如何解决java dao查询中java.lang.NullPointerException?

本人初学者,不懂怎么修改,求大神帮我修改代码可用。

java.lang.NullPointerException
	com.highcom.dao.BaseDao.query(BaseDao.java:56)
	com.highcom.action.LoginServlet.doPost(LoginServlet.java:35)
	javax.servlet.http.HttpServlet.service(HttpServlet.java:710)
	javax.servlet.http.HttpServlet.service(HttpServlet.java:803)
	com.highcom.filter.ChinaFilter.doFilter(ChinaFilter.java:23)

BaseDao:

package com.highcom.dao;

import java.io.InputStream;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Map;
import java.util.Properties;

public class BaseDao {

    Connection conn = null;
    Statement st = null;
    ResultSet rs = null;
    
    public void init(){
        InputStream in = BaseDao.class.getResourceAsStream("jdbc.properties");
        Properties pro = new Properties();
        try {
            pro.load(in);
            Class.forName(pro.getProperty("Driver"));
            conn = DriverManager.getConnection(pro.getProperty("Url"), pro.getProperty("User"), pro.getProperty("Pwd"));
            st = conn.createStatement();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
    public int update(String sql) {
        this.init();
        int a = 0;
        try {
            a = st.executeUpdate(sql);
        } catch (SQLException e) {
            e.printStackTrace();
        }
        this.close();
        return a ;
    }
    
    public ArrayList<Map<String,Object>> query(String sql) {
        this.init();
        try {
        rs = st.executeQuery(sql);
        // 执行查询返回结果集
        } catch (Exception e) {
            e.printStackTrace();
        }
    
        ArrayList<Map<String,Object>> list = new ArrayList<Map<String, Object>>();
        
        try {
            while (rs.next()) {
                Map<String,Object> map = new HashMap<String,Object>();
                for(int i =1;i<=rs.getMetaData().getColumnCount();i++) {
                    map.put(rs.getMetaData().getColumnName(i),rs.getObject(i));
                }    
                list.add(map);
            }
            rs.close();
            this.close();
        } catch (SQLException e) {
            e.printStackTrace();
        }
        return list;

    }    
    @SuppressWarnings("unchecked")
    public ArrayList queryList(String sql) {
        this.init();
        ArrayList list = new ArrayList();
        try {
            rs = st.executeQuery(sql);
            while(rs.next()){
                for (int i = 1; i <=rs.getMetaData().getColumnCount(); i++) {
                    list.add(rs.getObject(i));
                }
            }
            rs.close();
        } catch (SQLException e) {
            e.printStackTrace();
        }
        this.close();
        return list;
    }
    
    private void close() {
        try {
            conn.close();
            st.close();
        } catch (SQLException e) {
            e.printStackTrace();
        }
        
    }
}

LoginServlet类:

package com.highcom.action;

import java.io.IOException;
import java.util.ArrayList;
import java.util.Map;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;

import com.highcom.dao.BaseDao;

@SuppressWarnings("serial")
public class LoginServlet extends HttpServlet {

    public void doGet(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        this.doPost(request, response);
    }

    public void doPost(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        String username = request.getParameter("username");
        String pwd = request.getParameter("password");
        BaseDao bd = new BaseDao();
        StringBuffer sql = new StringBuffer();
        sql.append("select p_name from t_person where p_username='");
        sql.append(username);
        sql.append("'and p_pwd='");
        sql.append(pwd);
        sql.append("'");
        ArrayList<Map<String,Object>> list = bd.query(sql.toString());
        if(list.size()!=0){
            String name = (String) list.get(0).get("p_name");
            HttpSession session = request.getSession();
            session.setAttribute("username", username);
            session.setAttribute("pwd", pwd);
            session.setAttribute("name", name);
            request.getRequestDispatcher("/index.jsp").forward(request, response);
        }else {
            response.sendRedirect("login.htm");
        }
    }

}


最代码官方编辑于2016-4-19 21:21:55
所有回答列表(6)
sevenvsky的gravatar头像
sevenvsky  LV27 2016年4月19日

空指针是相当容易找出来的错误!
 

com.highcom.dao.BaseDao.query(BaseDao.java:47)
	com.highcom.action.LoginServlet.doPost(LoginServlet.java:34)

这里已经说明问题了!看你怎么处理了!BaseDao没处理好呢?还是LoginServlet传参没有判断为空的情况!

Smart_咚咚的gravatar头像
Smart_咚咚  LV13 2016年4月19日

错误处设断点,debug 看一下什么为空了呗

禅之禅的gravatar头像
禅之禅  LV9 2016年4月19日

你query  查询的数据 为空。没数据 或插错了

根据楼上的说的 debug 下 看 执行怎么样的语句 和怎么的结果

linminggood的gravatar头像
linminggood  LV4 2016年4月19日

本人是初学者,你们能说得再详细下解决的办法吗。

limtno的gravatar头像
limtno  LV23 2016年4月19日

这种问题在项目中如果想规避,又不想出现大的改动,建议使用自定义异常,一般规范点的工程里面都会采用自定义异常,很容易解决代码中莫名其妙的运行异常

剑客闯天涯的gravatar头像
剑客闯天涯  LV3 2016年4月20日

如何解决java dao查询中java.lang.NullPointerException?

你的sql有问题,可以在打印出来看就知道了smiley

顶部 客服 微信二维码 底部
>扫描二维码关注最代码为好友扫描二维码关注最代码为好友