Java ResultSet.isBeforeFirst意外抛出NullPointerException
我有以下代码:Java ResultSet.isBeforeFirst意外抛出NullPointerException,java,Java,我有以下代码: private ResultSet getResultSet(String id) { RDSPooledConnector rdsPooledConnector = connector.getConnector(endpoint, port); try (Connection connection = rdsPooledConnector.getConnection(); PreparedStatement pr
private ResultSet getResultSet(String id) {
RDSPooledConnector rdsPooledConnector = connector.getConnector(endpoint, port);
try (Connection connection = rdsPooledConnector.getConnection();
PreparedStatement preparedStatement = connection.prepareStatement(query)) {
preparedStatement.setString(1, id);
return preparedStatement.executeQuery();
} catch (SQLException exception) {
LOGGER.error("Failed to retrieve result set {}", id, exception);
return null;
}
}
@Override
public boolean shouldMove(String id) {
try {
ResultSet resultSet = getResultSet(id);
return resultSet != null && resultSet.isBeforeFirst(); // THIS LINE!
} catch (SQLException exception) {
LOGGER.error("Failed: {}", id, exception);
return false;
}
}
我在抛出NPE的行上发表了评论。堆栈跟踪是:
java.lang.NullPointerException: null
at com.mysql.jdbc.ResultSetImpl.isBeforeFirst(ResultSetImpl.java:6104)
at com.zaxxer.hikari.pool.HikariProxyResultSet.isBeforeFirst(HikariProxyResultSet.java)
考虑到getResultSet
方法中的try
块之后正在访问ResultSet
,我想知道为什么会发生这种情况。因此,我假设连接在到达调用isBeforeFirst
的行时关闭,即使多个线程调用此方法,每个线程都有自己的连接
这是ResultSetImpl.java
的isBeforeFirst
的代码:
public boolean isBeforeFirst() throws SQLException {
synchronized (checkClosed().getConnectionMutex()) {
return this.rowData.isBeforeFirst();
}
}
显然,
rowData
为空。但是我不明白为什么。ResultSet
对象实际上不应该在方法之间传递。@dan1st的评论一针见血。在方法getResultSet()
中,关闭PreparedStatement
,因此关闭ResultSet
。如果您真的想在方法之间传递结果集,请考虑btw,您应该总是关闭资源,如<代码> RESUTSETP>代码> S.@ DAND1,我看到了。我需要检查它是否关闭吗<代码>!resultSet.isClosed()。我想知道为什么它一开始就关上了?即使有多个线程,每个线程都应该有不同的结果集吗?我的意思是你应该以任何方式关闭它。顺便说一句,我认为只要PreparedStatement
关闭,它就会关闭。只需使用一个PreparedStatement
作为属性即可。谢谢你的回复。但是为什么它在99.99%的情况下都有效呢?你的建议意味着它根本不应该有效。请回答你的问题并发布一个帖子,这样我就可以验证你的说法。