Обрабатывать Исключения Обратного Вызова В Другом Методе

#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"); }  

Теперь я не получаю никаких ошибок.