Подтвердить что ты не робот

Try-with-resources: Должен ли я бросать или улавливать исключения метода close()?

Пожалуйста, исправьте меня, если это неверно: в инструкции Java 7 try-with-resources любые исключения, вызванные методом ресурса close(), должны быть объявлены как брошенные моим методом или я должен обернуть всю попытку в другой try, который ловит любые исключения, сброшенные на close().

Если это так, я должен задаться вопросом, буду ли я его использовать. Я, конечно, не хочу, чтобы throw исключения, сброшенные close(), вызывающий не знает, что с этим делать. И try упаковка другого try только для обработки close() выглядела бы не очень элегантно, по крайней мере для меня.

EDIT: Думаю, я случайно задал два вопроса, один из которых был дубликатом.

Вопрос 1. Должен ли я объявлять, что мой метод генерирует исключение из метода close() или обертывает try-with-resources в другой попытке? (Не ответил в предлагаемом дубликате.)

Вопрос 2. Есть ли способ закрыть ресурс молча? (Ясно, что это дубликат, поэтому я беру это предложение из вопроса. Надеюсь, это делает вопрос удовлетворительно уникальным.)

4b9b3361

Ответ 1

Цитата из Спецификация языка Java ($ 14.20.3.2):

14.20.3.2 Расширенные ресурсы try-with-resources

Оператор try-with-resources с по меньшей мере одним предложением catch и/или, наконец, предложение называется расширенным выражением try-with-resources. Значение расширенного оператора try-with-resources:

    попробуйте ResourceSpecification
        Блок
    Задвижки <суб > неавтоматическогосуб >
    наконец <суб > неавтоматическогосуб >

задается следующим переводом на базовый оператор try-with-resources (§14.20.3.1), вложенные в try-catch или try-finally или try-catch-finally Заявление:

    try {
        попробуйте ResourceSpecification
            Блок
     }
    Задвижки <суб > неавтоматическогосуб >
    наконец <суб > неавтоматическогосуб >

Эффект перевода заключается в том, чтобы поставить ResourceSpecification "внутри" попытки выражение. Это позволяет получить предложение catch расширенного оператора try-with-resources для исключения исключения из-за автоматической инициализации или закрытия любого ресурса.

Итак, в основном, оболочка уже реализована

Ответ 2

Из учебника Java

Оператор try-with-resources может иметь catch и, наконец, блокировать, как обычный пример try. В заявлении try-with-resources любой блок catch или finally запускается после того, как объявленные ресурсы были закрыты.

(акцент мой)

Итак, вы можете просто сделать

try (BufferedReader br =
               new BufferedReader(new FileReader(path))) {
    return br.readLine();
}
catch (IOException e) {
    // handle the exception that has been thrown by readLine() OR by close().
}

Ответ 3

Вам не нужно обертывать try-with-resources в другом блоке try-catch, вы просто добавляете блок catch:

class Foo implements AutoCloseable {
    public void close() throws Exception {
        throw new Exception();
    }
}

public class Try {
    public static void main(final String[] args) {
        try(Foo f = new Foo()) {
            System.out.println("No op!");
        } catch(Exception e) {
            e.printStackTrace();
        }
    }
}

Ответ 4

Вы должны просто добавить соответствующее предложение catch (Exception e) { }. Если вам нужна специальная обработка для определенного, или вы можете просто поймать Exception, если вам это нужно гораздо шире.

try (Statement stmt = con.createStatement()) {
    ResultSet rs = stmt.executeQuery(query);

    while (rs.next()) {
        String coffeeName = rs.getString("COF_NAME");
        int supplierID = rs.getInt("SUP_ID");
        float price = rs.getFloat("PRICE");

        System.out.println(coffeeName + ", " + supplierID + ", " + 
                           price + ", " + sales + ", " + total);
    }
} catch (Exception e) {
    System.out.println("Exception while trying to through the queries. ", e);
}

Так как это Java 7, вы можете поместить несколько исключений в предложение catch, или вы можете просто поймать самое внешнее исключение, которое вы хотите.