大家先看一段源码吧public <T> T query(String sql, ResultSetHandler<T> rsh, Object... params)
        throws SQLException {        Connection conn = this.prepareConnection();        try {
            return this.query(conn, sql, rsh, params);
        } finally {
            close(conn);
        }
    }
protected void close(Connection conn) throws SQLException {
        DbUtils.close(conn);
    }
public static void close(Connection conn) throws SQLException {
        if (conn != null) {
            conn.close();
        }
    }
说说我的疑问吧,对于try -return --fianlly 形式,我尝试了一下,在try中return语句执行之前,会先执行finally中的语句,但返回值并不受finally中语句的影响,除非finally中有return语句,不知道我的理解有问题吗?对于上面的几个函数,在return语句执行之前,先会去关闭 conn ,这样return this.query(conn, sql, rsh, params);中的conn岂不是处于closed状态,这样的话岂不是会抛异常??但上面的源码是commons-dbutils 中的源码,应该是不会有问题的,还请大伙不吝赐教

解决方案 »

  1.   

    ...先调用this.query(conn, sql, rsh, params);然后雪藏返回值,
    再查看finally是否覆盖返回值,最后返回应该返回的返回值...
    这算月经帖么?
      

  2.   

    先执行了查询,才关闭的链接。最后return 只是返回查询的值。
      

  3.   

    1楼正解,Java总是爱搞个莫名奇妙空间来雪藏变量的值,不信楼主可以试一下int i = 0; i=i++; System.out.println(i);补充两点:1、如果finally里面有return,最后返回的是finally里面的。2、唯一能阻止finally执行的是System.exit(),楼主可以在catch里面试一下,不过JVM都停止了,没意义。
      

  4.   

    呵呵,醍醐灌顶的感觉,之前验证过,但没考虑全,还以为return 执行之前会执行finally 没先到 Java的前辈们考录的更细,受教了!