【问题标题】:NullPointerException on calling ResultSet.getDate()调用 ResultSet.getDate() 时出现 NullPointerException
【发布时间】:2015-02-13 21:05:57
【问题描述】:

我在以下代码中调用ResultSet.getDate() 时收到java.lang.NullPointerException。然而,数据库中的条目似乎不是null。该连接似乎处于活动状态,因为正在获取其他字段。 我做错了什么?

try {
    ... /* Code that creates a connection and initializes statement */

    String query = "SELECT * FROM groups WHERE id = 'testGroup1'";
    ResultSet rs = statement.executeQuery(query);
    if(rs.next()) {
        admin = rs.getString("admin_id");
        User.process(admin);
        java.sql.Date created_on = rs.getDate("created_on");
        System.out.println("Created on = " + created_on.toString());
    }
}
catch(Exception e) {
    System.out.println("Stuck here");
    e.printStackTrace();
}

这是输出和堆栈跟踪:

Admin id = 42          // User.process prints the admin id
Stuck here
java.lang.NullPointerException
    at com.mysql.jdbc.ResultSet.findColumn(ResultSet.java:966)
    at com.mysql.jdbc.ResultSet.getDate(ResultSet.java:1988)
    at com.myapp.server.model.Group.initInfo(Group.java:39)
    ...

我有以下架构:

+-------------------+--------------+------+-----+---------+-------+
| Field             | Type         | Null | Key | Default | Extra |
+-------------------+--------------+------+-----+---------+-------+
| id                | varchar(50)  | NO   | PRI | NULL    |       |
| admin_id          | varchar(50)  | NO   | MUL | NULL    |       |
| created_on        | datetime     | NO   |     | NULL    |       |
+-------------------+--------------+------+-----+---------+-------+

以及数据库中的以下条目:

+------------+----------+---------------------+
| id         | admin_id | created_on          |
+------------+----------+---------------------+
| testGroup1 | 42       | 2014-12-15 22:46:31 |
+------------+----------+---------------------+

【问题讨论】:

  • 你可以试试 rs.getTimestamp();
  • 我认为问题出在 SQL 日期格式上。 datetime 您指的是正确的数据类型吗?请改用Date
  • @SemihEker getTimestamp() 也会抛出 NullPointerException
  • 这似乎是您的 jdbc 驱动程序中的一个错误。您使用的是什么版本?最近的 mysql 驱动甚至没有一个名为 ResultSet 的类
  • @Dima 我使用的是mysql-connector-java-5.0.8。我已经升级到mysql-connector-java-5.1.34,它似乎有一个ResultSet 类。它现在显示 java.sql.SQLExceptionOperation not allowed after ResultSet closed

标签: java jdbc


【解决方案1】:

正如question中提到的那样,你能试试这样吗?

我也从上面提到的问题中获取代码。

Timestamp timestamp = resultSet.getTimestamp(i);
if (timestamp != null)
    date = new java.util.Date(timestamp.getTime()));

【讨论】:

  • getTimestamp() 也给出了同样的错误,就像我在评论中提到的那样。在rs.getTimestamp("created_on") 上获取NullPointerException
  • 您说“就像@SemihEker 建议的那样,getTimestamp() 最终给了我想要的结果。”。这个答案适合你吗?
  • 是的,一旦我摆脱了 NPE。 The errorUser.process 函数中。谢谢。
  • 哦,很高兴为您提供帮助 :)
【解决方案2】:

你的数据库中created_on字段的类型是datetime,这和Java的Date不一样

你需要转换它。

如果您查看question 的第一个答案,您将了解如何解决它

【讨论】:

  • 感谢您的链接。一旦我摆脱了NullPointerException,使用getTimestamp() 会给我想要的结果。
  • datetime(相当于时间戳)的转换是自动的,并且是 JDBC 规范要求的(它会简单地丢弃时间)
【解决方案3】:

我发现User.process 进一步查询了数据库,从而关闭了当前的ResultSet(或者我推测)。当我执行以下操作时,NullPointerException 会消失:

try {
    ...
    if(rs.next()) {
        admin = rs.getString("admin_id");
        java.sql.Timestamp created_on = rs.getTimestamp("created_on");
        User.process(admin);
    }
}
catch(Exception e) {
    ...
}

还按照其他解决方案的建议使用 getTimestamp() 得到我想要的结果。

【讨论】:

    猜你喜欢
    • 2013-12-29
    • 2012-01-21
    • 2012-08-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-05-16
    • 1970-01-01
    相关资源
    最近更新 更多