У меня есть множество методов для класса, которые требуют перехвата некоторых проверенных исключений, где все они будут обрабатываться одинаково. Следовательно, я хочу написать метод, чтобы заключить все функции в 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, важная часть состоит в том, что методы set.next () и set.getString () в моей функции getProperty требуют перехвата 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