封闭函数中未处理的检查异常

时间:2018-12-04 15:13:51

标签: java function exception unhandled-exception

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

1 个答案:

答案 0 :(得分:1)

如果您查看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