java.sql.SQLException:结果集已关闭

java.sql.SQLException:结果集已关闭,java,sqlite,Java,Sqlite,我无法执行进一步的处理,因为我在运行此代码时关闭了ResultSet。我在sqlite数据库表的15行之后添加值,我想找到15行的平均值,它应该存储在ArrayList中 代码如下:- try { Class.forName("org.sqlite.JDBC"); c = DriverManager.getConnection("jdbc:sqlite:test.db"); c.setAutoCommit(false); System.out.println("O

我无法执行进一步的处理,因为我在运行此代码时关闭了ResultSet。我在sqlite数据库表的15行之后添加值,我想找到15行的平均值,它应该存储在ArrayList中

代码如下:-

try {
    Class.forName("org.sqlite.JDBC");
    c = DriverManager.getConnection("jdbc:sqlite:test.db");
    c.setAutoCommit(false);
    System.out.println("Opened database successfully3");
    stmt = c.createStatement();
    rs = stmt
            .executeQuery("SELECT TIME,BID,ASK FROM '" + title + "' ;");
    System.out.println("Opened database successfully 20");
    while (rs.next()) {
        i++;
        System.out.println(i);
        if (i > 15) {
            System.out.println("i am in");
            List<String> stocklist = new ArrayList<String>();
            String main = rs.getString(1);
            System.out.println(rs.getString(1));
            String s[] = main.split(" ", 2);
            String date = s[0];
            String time = s[1];
            stocklist.add(date);
            stocklist.add(time);
            stocklist.add(df.format(rs.getFloat("BID")));
            stocklist.add(df.format(rs.getFloat("ASK")));
            rs1 = stmt
                    .executeQuery("SELECT ASK FROM '" + title + "' ;");
            int j = 1;
            while (rs1.next()) {
                if (j < i) {
                    System.out.println(rs1.getFloat("ASK"));
                    avg = avg + rs1.getFloat("ASK");
                }
                j++;
            }
            rs1.close();

            System.out.println("i am out");
            avg = avg / 15;
            changepercent = ((rs.getFloat("ASK") - avg) / avg) * 100;
            stocklist.add(df.format(changepercent));
            stocklist.add("ETE");
            stocklist.add("HUN");
            stocklist.add("ALU");
            stocklist.add("ETE");
            stocklist.add("HUN");
            stocklist.add("ALU");
            stocklist.add("ETE");
            stocklist.add("HUN");
            hntm.addRow(stocklist);
        }
    }
    rs.close();
    stmt.close();
    c.close();
} catch (Exception e) {
    System.err.println(e.getClass().getName() + ": " + e.getMessage());
    System.exit(0);
}
试试看{
Class.forName(“org.sqlite.JDBC”);
c=DriverManager.getConnection(“jdbc:sqlite:test.db”);
c、 设置自动提交(错误);
System.out.println(“已成功打开数据库3”);
stmt=c.createStatement();
rs=stmt
.executeQuery(“从“+”标题“;”)中选择时间、出价、询问”;
System.out.println(“已成功打开数据库20”);
while(rs.next()){
i++;
系统输出打印LN(i);
如果(i>15){
System.out.println(“我在”);
List stocklist=new ArrayList();
字符串main=rs.getString(1);
System.out.println(rs.getString(1));
字符串s[]=main.split(“,2);
字符串日期=s[0];
字符串时间=s[1];
存货清单。添加(日期);
存货清单。添加(时间);
添加(df.格式(rs.getFloat(“投标”));
stocklist.add(df.format(rs.getFloat(“ASK”));
rs1=stmt
.executeQuery(“从“+”标题+“;”中选择询问”;
int j=1;
while(rs1.next()){
if(j
不应重复使用语句。创建新查询时,需要使用新的语句对象。替换
rs1=stmt.executeQuery(“从“+”标题+“;”中选择询问”)带有
rs1=c.createStatement().executeQuery(“从“+”标题+“;”中选择询问”)

这不是这个问题的答案,但我对
java.sql.SQLException:ResultSet closed也有问题

在我的例子中,查询结果是空的,我使用的是SQLite,因此结果集返回closed

PreparedStatement preparedStatement = connection.prepareStatement(sql);
ResultSet resultSet = preparedStatement.executeQuery();

// resultSet closed == didn't find anything
if(resultSet.isClosed())
    return false;
我使用PostgreSQL进行测试,结果集即使在查询为空时也保持打开状态。我没想到不同的数据库会有不同的行为

如果有人想检查我的测试:


如前所述,检查连接是否仍然打开的更好方法是使用
resultSet.isnext()

尝试在rs1Thanks循环中创建另一个语句。很多时候,它都在工作。。。w您不能同时从同一
语句中使用多个
结果集
对象。我同意:这肯定不是答案。这也不正确
ResultSet.next()
返回
false
表示未找到任何内容。你不可能从这段代码中得到
resultSet.isClosed()==true
。@marqueisoflorne你是对的,
next()
是正确的方法。在使用SQLite时,我实际上得到了
resultSet.isClosed()==true
,在使用PostgreSQL时得到了
resultSet.isClosed()==false
(今天勾选)。更新了答案,以便更清楚地了解我何时遇到此异常。您可以重用
语句
对象。这个答案是不正确的。问题出在别处。