#java #exception #callback
#Ява #исключение #обратный звонок
Вопрос:
Я подключаюсь к базе данных и хочу выполнять запросы с помощью обратных вызовов, поэтому я написал это:
public void query(String query, Consumerlt;ResultSetgt; callback, String database) throws SQLException { Connection connection; try { Class.forName(DRIVER_CLASS); } catch (Exception e) { e.printStackTrace(); } connection = DriverManager.getConnection(URL "/" database, USER, ""); Statement statement = connection.createStatement(); ResultSet resultSet = statement.executeQuery(query); callback.accept(resultSet); connection.close(); } public void printUsernames() throws SQLException { query("SELECT username FROM users;", (ResultSet set) -gt; { while (set.next()) { String username = set.getString("username"); System.out.println(username); } }, "cloud"); }
Даже если query
методы printUsernames
и объявляют оператор throws, потребитель, которого я передаю printUsernames
, все равно выдает ошибки компиляции (я предупрежден, что не обрабатываю возможные исключения sql).
Есть ли способ обрабатывать исключения потребителей внутри query
, чтобы мне не приходилось снова и снова писать try-catch для любых других запросов?
Комментарии:
1. В чем именно заключается ошибка, которую вы получаете?
2. Исключение в потоке «основной» java.lang. Ошибка: Нерешенная проблема компиляции: в основном. ConnectDB.main(ConnectDB.java:41) В основном методе я просто создаю новую базу данных ConnectDB и вызываю
printUsernames
внутри try-catch.3. Есть ли сообщение об ошибке, в котором конкретно говорится, что это связано с неучтенными исключениями SQL?
4. Да; мой редактор выделяет
set.next
иset.getString
(внутриprintUsernames
) уведомляет меня о необработанном исключении типа SQLException
Ответ №1:
Оказывается, я могу добавить оператор throws в методы интерфейса, поэтому я написал это:
@FunctionalInterface public interface Querier { public void query(ResultSet res) throws SQLException; }
Если я немного переработаю свой предыдущий код…
public void query(String query, Querier callback, String database) throws SQLException { Connection connection; try { Class.forName(DRIVER_CLASS); } catch (Exception e) { e.printStackTrace(); } connection = DriverManager.getConnection(URL "/" database, USER, ""); Statement statement = connection.createStatement(); ResultSet resultSet = statement.executeQuery(query); callback.query(resultSet); connection.close(); } public void printUsernames() throws SQLException { query("SELECT username FROM users;", (ResultSet set) -gt; { while (set.next()) { String username = set.getString("username"); System.out.println(username); } }, "cloud"); }
Теперь я не получаю никаких ошибок.