报了空指针异常

报了空指针异常

我的代码好像视频里一样,自己测试也可以查询到记录,但是却报了空指针异常错误?哪里有问题?

正在回答 回答被采纳积分+1

登陆购买课程后可参与讨论,去登陆

6回答
一叶知秋519 2018-01-30 10:50:50

你好,关闭顺序最优依次是ResultSet  Statement Connection;因此建议将ConnectionUtil()方法中的release方法的关闭顺序调整一下:

public static void release(Connection con, Statement sta, ResultSet res) {
        try {
            if (res != null) {
                res.close();
            }
        } catch (SQLException e) {
            e.printStackTrace();
        } finally {
            try {
                if (sta != null) {
                    sta.close();
                }
            } catch (SQLException e) {
                e.printStackTrace();
            } finally {
                try {
                    if (con != null) {
                        con.close();
                    }
                } catch (SQLException e) {
                    e.printStackTrace();
                }
            }
        }
    }

你修改关闭顺序后再试下,如果还有问题,可以再次提问。祝学习愉快~

  • 提问者 慕容5410851 #1
    我把catch块里的SQLException e 改成了Exception e 后就正常运行了。。。
    2018-01-30 11:44:56
提问者 慕容5410851 2018-01-29 19:27:48

ConnectionUtil类的代码如下,没发现什么问题:

package common;

import java.sql.*;

public final class ConnectionUtil {

    private ConnectionUtil(){}
    static {
        try {
            Class.forName("com.mysql.jdbc.Driver");
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        }
    }

    private static String url = "jdbc:mysql://localhost:3306/message_board";
    private static String user = "root";
    private static String passward = "lin123";

    public static Connection getConnection(){
        try {
            return DriverManager.getConnection(url, user, passward);
        } catch (SQLException e) {
            e.printStackTrace();
        }
        return null;
    }

    public static void release(Connection con, Statement sta, ResultSet res){

            try {
                if (res != null) {
                    res.close();
                }
            } catch (SQLException e) {
                e.printStackTrace();
            }finally {
                    try {
                        if (con != null){
                        con.close();
                        }
                    } catch (SQLException e) {
                        e.printStackTrace();
                    }finally {

                            try {
                                if (sta != null){
                                    sta.close();
                                }
                            } catch (SQLException e) {
                                e.printStackTrace();
                            }
                        }
                }
            }


    }


好帮手慕珊 2018-01-29 15:17:25

你好!下面这个类中,MessageDao只是声明了,没有创建对象,可以定义一个MessageService的构造方法,在该构造方法中创建MessageDao对象,然后赋值给messageDao。一般出现空指针异常都是因为调用方法的对象不存在造成的。所以可以看一下控制台的错误提示,会指出具体是哪一行代码出问题,然后进行原因排查,看看是否创建了对象,或者引用是否赋值的是一个非空的对象。祝学习愉快!

package service;
 
import bean.Message;
import dao.MessageDao;
 
import java.util.List;
 
public class MessageService {
 
    private MessageDao messageDao;
    public MessageService(){
        messageDao = new MessageDao();
    }
 
    public List<Message> getMessage(int page, int pageSize){
        return messageDao.getMessage(page, pageSize);
    }
 
    public int count(){
        return messageDao.count();
    }
}


  • 提问者 慕容5410851 #1
    第12行的位置我已经创建了对象了啊?
    2018-01-29 15:32:32
  • 好帮手慕珊 回复 提问者 慕容5410851 #2
    哦,那我运行的时候就没有问题了,我拷贝的你的代码,然后去替换老师的代码,此时提示空指针异常,是这个方法没有拷贝过去,改了之后就没有空指针异常了。你看一下你的提示中空指针异常在什么位置?哪条语句出现了空指针异常
    2018-01-29 15:41:48
  • 提问者 慕容5410851 回复 好帮手慕珊 #3
    这是报错信息: HTTP Status 500 – Internal Server Error Type Exception Report Description The server encountered an unexpected condition that prevented it from fulfilling the request. Exception java.lang.NullPointerException dao.MessageDao.getMessage(MessageDao.java:21) service.MessageService.getMessage(MessageService.java:16) servlet.MessageListServlet.service(MessageListServlet.java:33) javax.servlet.http.HttpServlet.service(HttpServlet.java:741) org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:53) Note The full stack trace of the root cause is available in the server logs.
    2018-01-29 16:20:52
提问者 慕容5410851 2018-01-29 14:04:30
package dao;

import bean.Message;
import common.ConnectionUtil;

import java.sql.*;
import java.util.ArrayList;
import java.util.List;

public class MessageDao {

    public List<Message> getMessage(int page, int pageSize){

        Connection con = ConnectionUtil.getConnection();
        PreparedStatement sta = null;
        ResultSet res = null;
        List<Message> list = new ArrayList<Message>();
        String sql = "select * from message order by create_time desc limit ?, ?";

        try {
            sta = con.prepareStatement(sql);
            sta.setInt(1,(page-1)*pageSize);
            sta.setInt(2,pageSize);
            res = sta.executeQuery();
            while (res.next()){
                Message message = new Message(res.getLong("id"), res.getLong("user_id"), res.getString("username"), res.getString("title"), res.getString("content"), res.getTimestamp("create_time"));
                list.add(message);
            }
        } catch (SQLException e) {
            System.out.println("连接失败");
            e.printStackTrace();
        }finally {
            ConnectionUtil.release(con, sta, res);
        }
        //System.out.println(list);
        return list;
    }

    public int count(){

        Connection con = ConnectionUtil.getConnection();
        PreparedStatement sta = null;
        ResultSet res = null;
        String sql = "select count(*) total from message";
        try {
            sta = con.prepareStatement(sql);
            res = sta.executeQuery();
            while (res.next()){
                return res.getInt("count");
            }
        } catch (SQLException e) {
            e.printStackTrace();
        }finally {
            ConnectionUtil.release(con, sta, res);
        }


        return 0;
    }

    public static void main(String[] args) {
        List<Message> list = new ArrayList<Message>();
        list = new MessageDao().getMessage(1,5);
        System.out.println(list.size());
    }
}


提问者 慕容5410851 2018-01-29 14:04:04
package service;

import bean.Message;
import dao.MessageDao;

import java.util.List;

public class MessageService {

    private MessageDao messageDao;
    public MessageService(){
        messageDao = new MessageDao();
    }

    public List<Message> getMessage(int page, int pageSize){
        return messageDao.getMessage(page, pageSize);
    }

    public int count(){
        return messageDao.count();
    }
}


提问者 慕容5410851 2018-01-29 14:03:37
package servlet;

import bean.Message;
import service.MessageService;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.util.List;

public class MessageListServlet extends HttpServlet{
    private MessageService messageService;

    @Override
    public void init() throws ServletException {
        super.init();
        messageService = new MessageService();
    }

    @Override
    protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        String pageStr = req.getParameter("page");
        int page = 1;
        if (pageStr != null && !pageStr.equals("")){
            try {
                page = Integer.parseInt(pageStr);
            } catch (NumberFormatException e) {
                e.printStackTrace();
            }
        }
        List<Message> messages = messageService.getMessage(page, 5);
        int count = messageService.count();
        req.setAttribute("messages", messages);
        req.setAttribute("page",page);
        int last = count % 5 == 0 ? count / 5 : count / 5 + 1;
        req.setAttribute("last", last);
        req.getRequestDispatcher("/WEB-INF/views/message_list.jsp").forward(req, resp);
    }

    @Override
    public void destroy() {
        super.destroy();
        messageService = null;
    }

    public static void main(String[] args) {
        MessageService messageService = new MessageService();
        List<Message> messages = messageService.getMessage(1, 5);
        for (Message message : messages){
            System.out.println(message);
        }
    }
}


问题已解决,确定采纳
还有疑问,暂不采纳

恭喜解决一个难题,获得1积分~

来为老师/同学的回答评分吧

0 星
Java数据库开发与实战应用2018版
  • 参与学习           人
  • 提交作业       277    份
  • 解答问题       4297    个

Java数据库开发的必备技能,从流行的MySQL数据库开始,到Java原生的数据库管理接口JDBC的使用,再到常用的数据持久化框架MyBatis,让你向Java工程师的目标又迈进了一步!

了解课程
请稍等 ...
意见反馈 帮助中心 APP下载
官方微信

在线咨询

领取优惠

免费试听

领取大纲

扫描二维码,添加
你的专属老师