业务逻辑是这样的
xxxAction.do作用到xxxAction调用下面DAO里面的方法retrieveAllAttackSolution() 
过程是这样的
高手帮下!
package struts.sample.cap1.sample3.dao;import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.Collection;import javax.sql.DataSource;import struts.sample.cap1.sample3.entity.AttackSolution;public class AttackSolutionDAO {
    //�ṩһ��JDBC��l�ӱ����ñ������ڹ��캯���б����ò���ֵ
    private DataSource dataSource;    /**
     * Ĭ�ϵĹ��캯��
     */
    public AttackSolutionDAO() {
    }    /**
     * �ڹ��캯���ṩJDBCl�ӵĽӿ�DataSource
     */
    public AttackSolutionDAO(DataSource ds) {
        dataSource = ds;    }
...
....
    public Collection retrieveAllAttackSolution() {
        //�ṩһ���Ԥ����SQL ���ı�
        PreparedStatement ps = null;        //�ṩһ���SQL��ѯ����ResultSet�ӿڱ�
        //ResultSet�����α����ָ�򷵻ؽ���е�ij���¼
        ResultSet rs = null;
               //ʵ��Collection�ӿڵ�ArrayList�࣬���������ʵ����Ϊ�������ķ���
        ArrayList list = new ArrayList();        //SQL��䡰�������ѯfw_attacksolution��attack_event_code����
        String sql = "SELECT attack_event_code,attack_mean, attack_action from fw_attacksolution order by attack_event_code";        //JDBCl��
        Connection con = null;        try {
            //ȡ��JDBCl��
            con = dataSource.getConnection();            //�ж�JDBCl���Ƿ񱻹رգ���ر���ֱ���׳�һ��IllegalStateException
            if (con.isClosed()) {
                throw new IllegalStateException("ERROR.THE CONNECTION ISCLOSED");
            }            //Ԥ����SQL ��䲢ִ��
            ps = con.prepareStatement(sql);
            rs = ps.executeQuery();            //�����ؽ�����м�¼ʱ���д���
            while (rs.next()) {
                //����AttackSolution���͵ı���ʵ��
                //�����ﲻ�������ѭ�������ʵ���ԭ��������Լ�����һ��
                AttackSolution attackSolution = new AttackSolution();
                attackSolution.setAttack_event_code(rs.getString(1));
                attackSolution.setAttack_mean(rs.getString(2));
                attackSolution.setAttack_action(rs.getString(3));
                list.add(attackSolution);
            }
            //��׽SQLException
        } catch (SQLException ex) {
            //�ڿ���̨��SQLException��ӡ��4�������
            ex.printStackTrace();
        } finally {
            //�������δ���Ĺ������뽫JDBCl�ӹر�
            try {
                if (ps != null) {
                    ps.close();
                    con.close();
                }                //ע�����ﻹҪ�ر�ResultSet�Ľӿڱ�
                if (rs != null) {
                   rs.close();
                }
            } catch (SQLException e) {
                e.printStackTrace();
                throw new RuntimeException("ERROR.UNEXPECTED");
            }
        }
        //����list
        return list;
    }  
....
....
    public static void main(String[] args) {
    }
}

解决方案 »

  1.   

    try {
    if (ps != null) {
    ps.close();
    con.close();
    }if (rs != null) {
    rs.close();
    }
    } catch (SQLException e) {
    e.printStackTrace();
    throw new RuntimeException("ERROR.UNEXPECTED");
    }
    }return list;
    }
    ///////////////
    上面资源关闭顺序有问题,rs先关闭了,list当然就没有了。
    关闭顺序应该和开启顺序相反。
    先return list,再rs.close(),conn.close().
      

  2.   

    简单的说就是把return list;放到while后面while (rs.next()){
    ......
    }
    return list;
      

  3.   

    不可以放到while后面`
    这个方法的类型是public Collection retrieveAllAttackSolution() 
    这个return list是最后返回的
    按上面说的这样报错!return后面的代码无法到达!
      

  4.   

    我刚才把finally后面的去掉了!可以运行了!
     现在的问题是怎么写代码
    可以return list 以可以把rs 和con关闭啊!而不报result is closed的错啊
      

  5.   

    finally里面最后再加一个return null;
      

  6.   

    说错了,不需要加return null;了
      

  7.   

    把关闭资源的代码写在funally里
      

  8.   

    原始代码是把关闭资源写在finally里!
    但是return list是写在finally后面才可以啊!
    这样一来就会报result is closed错
      

  9.   

    不好意思,喝了点酒,大脑有点乱,代码没仔细看,现在酒醒了,应该还是资源关闭顺序错了。rs还没关,就先关ps和con,rs引用的对象不存在了,关闭rs肯定要抛SQLxception。
    应该是
    finally {
    try {
    if (rs != null) {
    rs.close();
    }

    if (ps != null) {
    ps.close();
    }

    if (con != null) {
    con.close();
    }
    } catch (SQLException e) {
    e.printStackTrace();
    throw new RuntimeException("ERROR.UNEXPECTED");
    }
    }