在处理关闭的结果集期间捕获了一个可抛出的异常:下一个

Posted

技术标签:

【中文标题】在处理关闭的结果集期间捕获了一个可抛出的异常:下一个【英文标题】:Caught a throwable exception during processing Closed Resultset: next 【发布时间】:2017-03-30 05:01:26 【问题描述】:

所以在我再次提出这个问题之前,我确实尝试过检查答案,我在下面的代码中收到了一个关闭的 ResultSet 异常。 当测试一小组记录时,相同的代码在开发环境中工作。但是在 QA 环境中,查询获取的 200-300 条记录也会遇到异常。 我的问题是,如果没有关闭语句或关闭连接代码,为什么下面代码中的 While 循环会抛出关闭的结果集异常?

public void extractRecordsAndUpdateData() throws Throwable 
    ConnectionManager mgr =null;

    /*
    * Some authentication code here for user authentication to allow access in the application
    */

    Connection c = null;
    try 
        mgr = mServiceLocator.getConnectionManager();
    
    catch (Exception newex) 
        newex.printStackTrace();
        customLogWriter.logEntry("Got a Exception during authentication " + newex.getMessage());
    

    PreparedStatement pSql = null;
    ResultSet myResultSet = null;

    try 
        c = mgr.getConnection(mgr.getSiteName());
        pSql = c.prepareStatement(extractSQL); // extractSQL is a simple select statement fetching records from DB to be processed in the while loop below.
        myResultSet = pSql.executeQuery();

    catch(SQLException ex)customLogWriter.logEntry("Error " + ex.getMessage());

    List<List> outerList=new ArrayList<List>();
    while (myResultSet.next())  // Exception encountered on this line of code
     
        /*Do some processing*/
    

    customLogWriter.close();

【问题讨论】:

【参考方案1】:

结构不良的异常处理。 ResultSet.next() 循环应该在 try 块内。你应该只有一个try和一个catch (SQLException ...)

不要写这样的代码。依赖于先前try 块中代码成功的代码应位于该try 块内。

【讨论】:

同意,代码正在更新,但想了解这里的实际问题是什么?是resultSet为空并给出了关闭的resultset异常还是其他问题? 我想知道您是否发布了真实代码。如果myResultSet 是实例成员而不是局部变量,那么您当前的代码结构将允许您在之前的try 块中的异常之后调用next(),这意味着您正在重用之前的ResultSet已经关门了。

以上是关于在处理关闭的结果集期间捕获了一个可抛出的异常:下一个的主要内容,如果未能解决你的问题,请参考以下文章

java异常处理机制

PHP 异常处理 总出现致命错误 无法捕获异常

为啥不能在主线程中直接捕获和处理工作线程抛出的异常?

如何捕获ctypes中抛出的异常?

Spring事务源码(1)-TransactionInterceptor

在java中捕获所有抛出的异常?