Java 调用ResultSet.getDate()时出现NullPointerException
在下面的代码中调用Java 调用ResultSet.getDate()时出现NullPointerException,java,jdbc,Java,Jdbc,在下面的代码中调用ResultSet.getDate()时,我得到了一个java.lang.NullPointerException。但是,数据库中的条目似乎不是null。连接似乎处于活动状态,因为正在提取其他字段。 我做错了什么 try { ... /* Code that creates a connection and initializes statement */ String query = "SELECT * FROM groups WHERE id = 'tes
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 |
+------------+----------+---------------------+
在数据库中创建的字段
的类型是datetime
,这与JavaDate
不同
你需要转换它
如果你看看第一个答案,你会看到如何解决它,正如本文所提到的,你能试一下这样的sthg吗
我也从上面提到的问题中获取代码
Timestamp timestamp = resultSet.getTimestamp(i);
if (timestamp != null)
date = new java.util.Date(timestamp.getTime()));
我发现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()
,也可以获得所需的结果。您能试试rs.getTimestamp()吗;我认为问题在于SQL日期格式。您引用的datetime
数据类型是否正确?请改为尝试Date
。@SemihEkergetTimestamp()
也会抛出NullPointerException
。这似乎是jdbc驱动程序中的一个错误。您使用的版本是什么?最近的mysql驱动程序甚至没有名为ResultSet
@Dima的类,我使用的是mysql-connector-java-5.0.8
。我已经升级到了mysql-connector-java-5.1.34
,它似乎有一个ResultSet
类。现在,它显示了一个java.sql.SQLException
语句,表示在ResultSet关闭后不允许执行操作
getTimestamp()
也会出现相同的错误,就像我在注释中提到的那样。在rs.getTimestamp(“created_on”)
上获得NullPointerException
。您说过“就像@SemihEker建议的那样,getTimestamp()最终会给我期望的结果。”。这个答案对你合适吗?是的,一旦我摆脱了NPE。在User.process
函数中。谢谢。哦,我很高兴帮助你:)谢谢你的链接。使用getTimestamp()
可以在我摆脱NullPointerException
之后获得所需的结果。从datetime
(相当于时间戳)转换是自动的,并且是JDBC规范所要求的(它只需删除时间)