运行老师代码出现500错误

运行老师代码出现500错误

02-Dec-2018 14:46:39.621 严重 [http-nio-8080-exec-5] org.apache.catalina.core.StandardWrapperValve.invoke Servlet.service() for servlet [MessageListServlet] in context with path [] threw exception

 java.lang.NullPointerException

at com.imooc.jdbc.dao.MessageDAO.getMessages(MessageDAO.java:61)

at com.imooc.jdbc.service.MessageService.getMessages(MessageService.java:34)

at com.imooc.jdbc.servlet.MessageListServlet.service(MessageListServlet.java:41)

at javax.servlet.http.HttpServlet.service(HttpServlet.java:741)

at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:231)

at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)

at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:53)

at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193)

at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)

at com.imooc.jdbc.filter.UserFilter.doFilter(UserFilter.java:30)

at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193)

at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)

at com.imooc.jdbc.filter.CharsetEncodingFilter.doFilter(CharsetEncodingFilter.java:28)

at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193)

at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)

at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:199)

at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:96)

at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:490)

at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:139)

at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:92)

at org.apache.catalina.valves.AbstractAccessLogValve.invoke(AbstractAccessLogValve.java:668)

at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:74)

at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:343)

at org.apache.coyote.http11.Http11Processor.service(Http11Processor.java:408)

at org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:66)

at org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:791)

at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1417)

at org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:49)

at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)

at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)

at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61)

at java.lang.Thread.run(Thread.java:748)

我mysql 版本较高 所以java Connector包为8.0版本

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

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

5回答
好帮手慕阿莹 2018-12-04 10:32:53

1、我这边看到的61行是个try,所以请问同学报错的61行具体是哪行代码呢?

2、是stmt = conn.prepareStatement(sql);  这行代码么?,如果是,说明 ConnectionUtil.getConnection() 获取到的是null。建议同学点进去看看ConnectionUtil里是怎么写的。

3、建议同学检查一下你的驱动版本是否和mysql版本一致呢?

建议同学按照上边的步骤检查一下。

如果我的回答解决了你的疑惑,请采纳!祝学习愉快!

  • 提问者 curney #1
    问题确实出在连接上,所以我新建一个类来测试连接,发现 新版本要这样写 private static String driver = "com.mysql.cj.jdbc.Driver"; private static String url = "jdbc:mysql://localhost:3306/message_board?useSSL=false&characterEncoding=utf8&serverTimezone=GMT"; 还有tomcat....没配置 但是之前可以运行项目。。。很迷
    2018-12-04 22:32:11
  • 好帮手慕阿莹 回复 提问者 curney #2
    emmmm。。所以同学是解决了是么? 祝学习愉快。
    2018-12-05 09:23:55
提问者 curney 2018-12-03 22:33:18

package com.imooc.jdbc.dao;

import com.imooc.jdbc.bean.Message;
import com.imooc.jdbc.common.ConnectionUtil;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Timestamp;
import java.util.ArrayList;
import java.util.List;

/**
* 消息DAO
*
* @version 1.0
*/
public class MessageDAO {
   /**
    * 保存留言信息
    * @param message
    * @return
    */

   public boolean save(Message message) {
       Connection conn = ConnectionUtil.getConnection();
       String sql = "insert into message(user_id, username, title, content, create_time) values (?, ?, ?, ?, ?)";
       PreparedStatement stmt = null;
       try {
           stmt = conn.prepareStatement(sql);
           stmt.setLong(1, message.getUserId());
           stmt.setString(2, message.getUsername());
           stmt.setString(3, message.getTitle());
           stmt.setString(4, message.getContent());
           stmt.setTimestamp(5, new Timestamp(message.getCreateTime().getTime()));
           stmt.execute();
       } catch (SQLException e) {
           System.out.println("保存留言信息失败。");
           e.printStackTrace();
           return false;
       } finally {
           ConnectionUtil.release(null, stmt, conn);
       }
       return true;
   }

   /**
    * 分页查询全部留言
    * @param page 当前页码
    * @param pageSize 每页记录数
    * @return
    */
   public List<Message> getMessages(int page, int pageSize) {
       System.out.println("wtf");
       Connection conn = ConnectionUtil.getConnection();
       String sql = "select * from message order by create_time desc limit ?, ?";//limit m, n:从第m条开始,取出总共n条记录
       PreparedStatement stmt = null;
       ResultSet rs = null;
       List<Message> messages = new ArrayList<>();
       try {
           stmt = conn.prepareStatement(sql);
           stmt.setInt(1, (page - 1) * pageSize);
           stmt.setInt(2, pageSize);
           rs = stmt.executeQuery();
           while (rs.next()) {
               messages.add(new Message(rs.getLong("id"),
                       rs.getLong("user_id"),
                       rs.getString("username"),
                       rs.getString("title"),
                       rs.getString("content"),
                       rs.getTimestamp("create_time")));
           }
       } catch (SQLException e) {
           e.printStackTrace();
       } finally {
           ConnectionUtil.release(rs, stmt, conn);
       }
       return messages;
   }

   /**
    * 计算所有留言数量
    * @return
    */
  public int countMessages() {
      Connection conn = ConnectionUtil.getConnection();
      String sql = "select count(*) total from message";
      PreparedStatement stmt = null;
      ResultSet rs = null;
      try {
          stmt = conn.prepareStatement(sql);
          rs = stmt.executeQuery();
          while (rs.next()) {
              return rs.getInt("total");
          }
      } catch (SQLException e) {
          e.printStackTrace();
      } finally {
          ConnectionUtil.release(rs, stmt, conn);
      }
      return 0;
  }

}

提问者 curney 2018-12-03 18:57:15

这个程序从哪里开始运行? 我在出错的 位置前面加了输出语句没有反应

  • 那请同学衣一下你的MessageDAO的代码,并告诉我们一下,之前报的61行具体是哪行代码。注意不要贴在回复里注意不要贴在回复里,会失去代码的格式。可以在回答里贴一下。祝学习愉快。 如果我的回答解决了你的疑惑,请采纳!祝学习愉快!
    2018-12-03 19:03:23
好帮手慕阿莹 2018-12-03 10:11:19

http://img1.sycdn.imooc.com//climg/5c04900900015dee08970306.jpg

如上图所示,空指针异常代码有值为null的对象去调用属性或者方法时就会报空指针异常

同学可以看到,报错提示显示MessageDao中的第61行报错了,

建议同学看看MessageDao中的第61行中是否有对象在调用方法,该对象应该是null,同学可以检查一下,为什么该对象为null。

如果我的回答解决了你的疑惑,请采纳!祝学习愉快!

提问者 curney 2018-12-02 15:02:14

我是在idea导入后 用tomcat 9.0 打开留言板项目

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

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

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

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

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

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

在线咨询

领取优惠

免费试听

领取大纲

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