java - 在封闭函数中处理未处理的检查异常
问题描述
对于一个需要捕获一些已检查异常的类,我有很多方法,它们都将以相同的方式处理。因此,我想编写一个方法来用 try catch 封装所有函数。这是使用 JDBC 的完整代码:
private static <T> T HandleResultSet(ResultSet rs, Function<ResultSet, T> fn) {
T returnValue = null;
try {
while (rs.next()) {
returnValue = fn.apply(rs);
}
}
catch(SQLException se)
{
se.printStackTrace();
}
finally
{
try {
if (rs != null)
rs.close();
}
catch(SQLException se) {
se.printStackTrace();
}
return returnValue;
}
}
public static String MySQLMethod(int param)
{
Function<ResultSet, String> getProperty = (ResultSet set) ->
{
if (set.next())
return set.getString("Property");
return "ERR";
};
ResultSet rs = CallSQL("SELECT * FROM [User] WHERE Param = '" + param + "';");
return HandleResultSet(rs, getProperty);
}
对于那些不熟悉 JDBC 的人来说,重要的部分是我的“getProperty”函数中的“set.next()”和“set.getString()”方法需要捕获 SQLException。这个捕获包含在“HandleResultSet”中,但编译器似乎不够聪明,无法知道这一点,而且我似乎无法解决这个问题。关于如何处理这个问题的任何想法?
我正在使用最新版本的 IntelliJ IDEA。
解决方案
如果您查看它的签名,java.util.function.Function#apply
则不会引发任何异常。所以你必须创建自己的界面,它会抛出SQLException
:
@FunctionalInterface
public interface CheckedFunction<T, R> {
R apply(T t) throws SQLException;
}
接着:
CheckedFunction<ResultSet, String> getProperty = (ResultSet set) -> {
if (set.next())
return set.getString("Property");
return "ERR";
};
也try-with-resources
用于ResultSet
推荐阅读
- javascript - 有没有一种方法可以通过另一个页面中发生的事件来影响我的项目中的一个页面
- python - 这个循环有什么问题?继续在这里不起作用
- node.js - onCreate 处理程序的 DocumentSnapshot 未定义
- reactjs - 如何在生产状态下部署我的 Laravel React 项目
- php - 如何安装 libssh2?
- php - AngularJS ng-model 无法从输入字段中获取数据
- objective-c - 如何使用脚本编辑器库中列出的 Objective-C API?
- graphql - 如何进行不区分大小写的graphql查询?
- python - 让 matplotlib 图形用新数据更新
- solidity - 如何使用终端在 Ubuntu 18.04 上安装较旧的 Solidity 版本