在Try-With-Resource块中返回资源

时间:2015-11-09 23:07:09

标签: postgresql try-with-resources

我的情况是我有一个执行SQL查询的函数,我想将结果传递给一个将它们保存为CSV文件的函数。我写了这个try-with-resource块来利用AutoClosable:

public static ResultSet getRiderHistory(File file, Calendar date) throws FileNotFoundException {

    try(Connection conn = new dbConnect("psql", "localhost", ****, "*****", "****", "").get_conn();
        PreparedStatement pstmt = createPreparedStatement(conn, getSerialFromFile(file), date);
        ResultSet rs = pstmt.executeQuery()) {

        if(!rs.isBeforeFirst()) {
            throw new SQLException("ResultSet retuned empty!");
        }

        return rs;

    } catch (FileNotFoundException e) {
        throw new FileNotFoundException();
    } catch (Exception e) {
        e.printStackTrace();
    }
}

但编译器正在退出此错误:

compile:
    [javac] Compiling 2 source files to /home/****
    [javac] /home/****/****.java:50: error: missing return statement
    [javac]     }
    [javac]     ^
    [javac] 1 error

我想我理解问题的本质是什么原因。我猜它是因为我试图返回一个将要关闭的资源,而不是像我想要的那样复制结果(如果我是这样,请纠正我。 ;我错了)。但是,由于我是Java的新手,我真的不知道如何解决这个问题并获得我想要的结果。我应该以某种方式在ResultSet上使用finally,还是应该将返回值更改为类似ArrayList的对象,这个对象不必关闭?

1 个答案:

答案 0 :(得分:1)

不,错误是说您的上一个catch (Exception)块没有返回值。 try 的主体返回一个值,第一个 catch 引发异常,但最后一个 catch 除了打印一个堆栈跟踪外什么都不做。此方法中的所有返回路径必须1)返回ResultSetnull,或2)抛出异常。