在 Try-With-Resource 块中返回资源
Returning Resource in Try-With-Resource block
我的情况是我有一个函数执行 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
我想我明白了问题的本质。我猜这是因为我正在尝试 return 将要关闭的资源,而不是我想要的结果副本(如果我错了请纠正我)。然而,由于我是 Java 的新手,我真的不知道如何解决这个问题并获得我想要的结果。我应该以某种方式在 ResultSet 上使用 finally
,还是应该将 return 值更改为类似 ArrayList
的东西,一个不必关闭的对象?
不,错误是说您的最后一个 catch (Exception)
块没有 return 值。 tryreturn的主体是一个值,第一个catch抛出异常,但最后一个catch 除了打印堆栈跟踪外什么都不做。此方法中的所有 return 路径必须 1) return a ResultSet
或 null
,或 2) 抛出异常。
我的情况是我有一个函数执行 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
我想我明白了问题的本质。我猜这是因为我正在尝试 return 将要关闭的资源,而不是我想要的结果副本(如果我错了请纠正我)。然而,由于我是 Java 的新手,我真的不知道如何解决这个问题并获得我想要的结果。我应该以某种方式在 ResultSet 上使用 finally
,还是应该将 return 值更改为类似 ArrayList
的东西,一个不必关闭的对象?
不,错误是说您的最后一个 catch (Exception)
块没有 return 值。 tryreturn的主体是一个值,第一个catch抛出异常,但最后一个catch 除了打印堆栈跟踪外什么都不做。此方法中的所有 return 路径必须 1) return a ResultSet
或 null
,或 2) 抛出异常。