【问题标题】:Getting ResultSet is closed exception but i didn't close it in the code获取 ResultSet 是关闭异常,但我没有在代码中关闭它
【发布时间】:2013-08-19 05:54:38
【问题描述】:

首先,这是我的代码:

public void getGK()
 {

add(p4);
setSize(1200,700);
setLocation(30,17);
p4.setVisible(true);
p4.setLayout(null);

final CheckboxGroup cg=new CheckboxGroup();

final JLabel q=new JLabel();
final JButton b6=new JButton("Submit");


b6.setBounds(150,250,80,50);
q.setBounds(40,40,1000,50);
q.setForeground(Color.RED);
q.setFont(new Font("Castellar",Font.BOLD,15));
 p4.add(l1);
try
{  

    Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");
    co=DriverManager.getConnection("jdbc:odbc:Quizdata","","");
    st=co.createStatement();



   final String s2="SELECT * FROM GK Where ID="+lx[n];
    re=st.executeQuery(s2);



    q.setText(re.getString(2));
        p4.add(q);
     final Checkbox c5=new Checkbox();  
     final Checkbox c1=new Checkbox(re.getString(3),cg,false);
     final Checkbox c2=new Checkbox(re.getString(4),cg,false);
     final Checkbox c3=new Checkbox(re.getString(5),cg,false);
     final Checkbox c4=new Checkbox(re.getString(6),cg,false);
     c1.setBounds(40,100,400,20);
       c2.setBounds(40,130,400,20);
       c3.setBounds(40,160,400,20);
      c4.setBounds(40,190,400,20);
      p4.add(c1);
      p4.add(c2);
      p4.add(c3);
      p4.add(c4);
      p4.add(b6);


   re.;
    final String s3=re.getString("Answer");
     b6.addActionListener(new ActionListener()
  {
   @Override
  public void actionPerformed(ActionEvent e) {


      if(s3.equals(cg.getSelectedCheckbox().getLabel()))
  {
     System.out.println("THis is correct bwoy " +cg.getSelectedCheckbox().getLabel());     
     n++;
     score++;
     remove(p4);
     p4.removeAll();
     if(n<10)
     {
        getGK(); 
     }   

     else
     {
         System.out.println("Thanks for playing");
     }
     }  
     else

    {
     System.out.println("You are wrong");
   }

    }


   });

    co.close();
    st.close();



   }
   catch(Exception z)
   {
      JOptionPane.showMessageDialog(null,z);
    }       


   }     

如您所见,我没有关闭resultset re,但我仍然收到Resulset is closed exception .. 如何修复它。代码还有一个问题,当面板删除其所有组件然后再次添加新组件时,复选框可以正常工作但标签没有改变,我必须最大化框架才能更改它。 请尽快解决这个问题。

P.S.- 这里 lx[] 和 n 是通过这段代码来的:

   ArrayList<Integer> num=new ArrayList<Integer>();
     for(int it=1;it<=10;it++)
     {   num.add(it);}   




   for(int jt=0;jt<lx.length;++jt)
    {
        int i=(int)(Math.random()*num.size());
    lx[jt]=num.get(i);
        num.remove(i);
    }

【问题讨论】:

  • 您能否正确缩进您的代码。不可读。
  • @Himanshu 你能发布完整的错误堆栈跟踪吗?

标签: java


【解决方案1】:

您正在关闭语句 - 这也将关闭您的结果集。来自docs for ResultSet

当生成它的 Statement 对象关闭、重新执行或用于从多个结果序列中检索下一个结果时,ResultSet 对象会自动关闭。

您应该立即从结果集中提取所有相关数据,然后在 finally 块中关闭它(以及语句和连接) - 或使用 Java 7 中的 try-with-resources 语句。我也会强烈建议您将 UI 代码与数据访问代码分开。 (您当前的“用户界面”似乎也是控制台应用程序 (System.out.println) 和 Swing 的混合体,这很奇怪......)

【讨论】:

  • 那么如果我不关闭Statement会影响我的程序吗?
  • @Himanshu:是的,您将有潜在的资源泄漏 - 这就像打开文件句柄一样。通过立即获取数据然后关闭数据库相关资源来正确修复问题。
  • @John Skeet:标签问题呢?在每次递归调用时,它都无法正常工作..你能帮忙吗.. P.S.-实际上这只是我的代码的一部分(或者你可以说原型)我不会混合使用 UI 和控制台应用程序。 . 只是检查我的代码是否正常工作.. :)
  • @Himanshu:标签问题非常独立,应该在一个单独的问题中提出 - 并提供更详细的描述。
猜你喜欢
  • 1970-01-01
  • 2014-01-17
  • 2012-04-14
  • 2023-03-19
  • 1970-01-01
  • 2021-01-25
  • 1970-01-01
  • 2019-06-05
相关资源
最近更新 更多