背景描述
最近处于工作需要,用到了Apache的commons dbutils包来操作数据库。在保存数据到MySQL数据库时,报了一个空指针异常,作为开发多年的Java老鸟,最不怕的就是空指针异常,于是打上断点开始Debug,发现报错那行代码对象、传入方法中的参数竟然都不为空。。。
问题描述
不废话,直接上代码
问题代码
@Test
public void testDbutilsDateType() {
Connection connection = DBUtils.getConnection();
String sql = "insert into test (username, nickname, password, createtime) values (?,?,?,?)";
QueryRunner qr = new QueryRunner();
try {
// 报错的48行
int effectRows = qr.update(connection, sql, "lisi", "李四", "456", new Timestamp(System.currentTimeMillis()));
System.out.println("影响行数:" + effectRows);
} catch (SQLException e) {
e.printStackTrace();
} finally {
try {
connection.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
}
报错信息
java.lang.NullPointerException
at com.mysql.jdbc.PreparedStatement.setTimestamp(PreparedStatement.java:4241)
at com.mysql.jdbc.PreparedStatement.setObject(PreparedStatement.java:3591)
at com.mysql.jdbc.JDBC42PreparedStatement.setObject(JDBC42PreparedStatement.java:68)
at org.apache.commons.dbutils.AbstractQueryRunner.fillStatement(AbstractQueryRunner.java:374)
at org.apache.commons.dbutils.QueryRunner.update(QueryRunner.java:527)
at org.apache.commons.dbutils.QueryRunner.update(QueryRunner.java:444)
at com.john.demo.jdbc.TestJDBC.testDbutilsDateType(TestJDBC.java:48)
排查步骤
-
首先我把报错的第48行代码做了排查
int effectRows = qr.update(connection, sql, "lisi", "李四", "456", new Timestamp(System.currentTimeMillis(