首页 > 解决方案 > 在封闭函数中处理未处理的检查异常

问题描述

对于一个需要捕获一些已检查异常的类,我有很多方法,它们都将以相同的方式处理。因此,我想编写一个方法来用 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。

标签: javafunctionexceptionunhandled-exception

解决方案


如果您查看它的签名,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


推荐阅读