调用ResultSet.getDate()时出现了NullPointerException。

9

在以下代码中调用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 |
+------------+----------+---------------------+

2
你能试试 rs.getTimestamp() 吗? - Semih Eker
我认为问题会出在SQL日期格式上。你指的datetime是合适的数据类型吗?试试用Date代替。 - Aditya Peshave
@SemihEker getTimestamp() 方法也会抛出 NullPointerException 异常。 - John Bupit
2
看起来是你的jdbc驱动程序有bug。你使用的版本是什么?最近的mysql驱动程序甚至没有一个叫做“ResultSet”的类。 - Dima
像@SemihEker建议的那样,getTimestamp()最终给了我想要的结果。 - John Bupit
显示剩余2条评论
3个回答

4

正如在这个问题中提到的那样,你可以尝试像这样的代码:

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

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

getTimestamp()也会出现相同的错误,就像我在评论中提到的那样。在rs.getTimestamp("created_on")上得到了一个NullPointerException - John Bupit
你说过:“就像@SemihEker建议的那样,getTimestamp()最终会给我想要的结果。” 这个答案对你来说可以吗? - Semih Eker
是的,一旦我解决了NPE问题。这个错误User.process函数中。谢谢。 - John Bupit
哦,我很高兴能帮助到你 :) - Semih Eker

3

你的数据库中字段created_on的类型是datetime,与Java中的Date不同。

你需要进行转换。

如果你查看这个问题的第一个答案,你会看到如何解决它。


谢谢提供链接。使用 getTimestamp() 可以得到我想要的结果,一旦我解决了 NullPointerException 的问题。 - John Bupit
datetime(相当于时间戳)的转换是自动的,并且是 JDBC 规范所必需的(它将简单地删除时间)。 - Mark Rotteveel

2

我发现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()也可以得到所需的结果。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接