Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/325.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java ResultSet.isBeforeFirst意外抛出NullPointerException_Java - Fatal编程技术网

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%的情况下都有效呢?你的建议意味着它根本不应该有效。请回答你的问题并发布一个帖子,这样我就可以验证你的说法。