我的情况是我有一个执行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
的对象,这个对象不必关闭?
答案 0 :(得分:1)
不,错误是说您的上一个catch (Exception)
块没有返回值。 try 的主体返回一个值,第一个 catch 引发异常,但最后一个 catch 除了打印一个堆栈跟踪外什么都不做。此方法中的所有返回路径必须1)返回ResultSet
或null
,或2)抛出异常。