文件、数据库连接等资源最好都在finally里释放。最好是每次用完都马上释放,这样少占资源,在访问量大的系统里很有必要。

解决方案 »

  1.   

    finally 是要 保证不管出现什么情况都应该释放资源
    (主要是 可能出现异常或者return 语句太多了,放到 finally 中可以很好的整理代码的条理)。
    所以只要你有资源应该释放就放到 finally 中来。
      

  2.   

    完成后我都要加finally语句来释放呢?有没有必要
    -----------------------------------------------
    有必要
      

  3.   

    例如:
    public Collection getInfos(){
        Collection list = new LinkedList();    try{
            Class.forName("oracle.jdbc.driver.OracleDriver");
            Connection conn = DriverManager.getConnection("jdbc:oracle:thin:@localhost:1521:oraDB", "scott", "tiger").newInstance();
            Statement stmt = conn.createStatement();
            String sql = "select ename from emp";
            ResultSet rs = stmt.executeQuery(sql);
            
            while (rs.next()){
                list.add(new String(rs.getString("ename"));
            }
        }
        catch (ClassNotFoundException cnfe){
            cnfe.printStackTrace();
        }
        catch (SQLException sqle){
            sqle.printStackTrace();
        }
        finally{
            try{
                if (rs != null)  rs.close();
                if (stmt != null)  stmt.close();
                if (conn != null)  conn.close();
            }
            catch (SQLException sqle2){
                sqle2.printStackTrace();
            }
        }    return list;
    }
      

  4.   

    try{
     
    }catch(){}finally{}
      

  5.   

    loveyt(咆哮的独角兽) 我用了你的finally{
            try{
                if (rs != null)  rs.close();
                if (stmt != null)  stmt.close();
                if (conn != null)  conn.close();
            }
            catch (SQLException sqle2){
                sqle2.printStackTrace();
            }
        }
    这个,但是为什么我的rs它说找不到
      

  6.   

    异常处理时提供 finally 块来执行任何清除操作。如果抛出一个异常,那么相匹配的 catch 子句就会执行,然后控制就会进入 finally 块。 而没有异常抛出,也会进入finally块。
      

  7.   

    楼上的朋友这个知识我当然知道,但现在为什么我的程序
    try {
    String condition = "select * from " + r;
    ResultSet rs = connect.executeQuery(condition);
    rs.last();
    number = rs.getRow();
    } catch (SQLException e) {
    System.out.println(e.getMessage());
    }
    finally{ try{
                if (rs != null)  rs.close();
            }
            catch (SQLException sqle2){
                sqle2.printStackTrace();
            }
        }
    用eclipse编译rs它说找不到
      

  8.   

    文件、数据库连接等资源都在finally里释放,少占资源,尤其在访问量大的系统里很有必要。
      

  9.   

    loveyt(咆哮的独角兽) 我用了你的finally{
            try{
                if (rs != null)  rs.close();
                if (stmt != null)  stmt.close();
                if (conn != null)  conn.close();
            }
            catch (SQLException sqle2){
                sqle2.printStackTrace();
            }
        }
    这个,但是为什么我的rs它说找不到依我估计,你的rs 是在IF语句里面定义的.
    如果想在finally里面释放资源,最好这个对象定义在CLASS.的FUNCTION里的全局范围.
    比如说:  CLASS A下面有个B FUNCTION.那么:....
    pbulic void b()
    {
    ResultSet rs=null;
    try{
    ...
    if(){
    rs=....
    //不能在这里面定义ResultSet rs=.....
    }
    }catch(){}
    finally{//这个时候就可以在FINALLY里面释放你想要的资源了.
            try{
                if (rs != null)  rs.close();
                if (stmt != null)  stmt.close();
                if (conn != null)  conn.close();
            }
            catch (SQLException sqle2){
                sqle2.printStackTrace();
            }
        }}
    不知道你是不是这样定义的.finally如果不考虑资源占用的话,一般情况下可以不用.
    它的意思就是说:不管你操作有没有成功. TRY通过也好.CATCH到EXCEPTION也好.都要做如下操作.