Spec-Zone .ru
спецификации, руководства, описания, API
След: Существенные Классы
Урок: Исключения
Раздел: Ловля и Обработка Исключений
Оператор попытки с ресурсами
Домашняя страница > Существенные Классы > Исключения

Оператор попытки с ресурсами

try- оператор с ресурсами является a try оператор, который объявляет один или более ресурсов. Ресурс является объектом, который должен быть закрыт после того, как программа заканчивается с ним. try- оператор с ресурсами гарантирует, что каждый ресурс закрывается в конце оператора. Любой объект, который реализует java.lang.AutoCloseable, который включает все объекты, которые реализуют java.io.Closeable, может использоваться в качестве ресурса.

Следующий пример читает первую строку из файла. Это использует экземпляр BufferedReader считать данные из файла. BufferedReader ресурс, который должен быть закрыт после того, как программа заканчивается с ним:

static String readFirstLineFromFile(String path) throws IOException {
    try (BufferedReader br =
                   new BufferedReader(new FileReader(path))) {
        return br.readLine();
    }
}

В этом примере, ресурс, объявленный в try- оператор с ресурсами является a BufferedReader. Оператор объявления сразу появляется в пределах круглых скобок после try ключевое слово. class BufferedReader, в Java SE 7 и позже, реализует интерфейс java.lang.AutoCloseable. Поскольку BufferedReader экземпляр объявляется в a try- оператор с ресурсом, это будет закрыто независимо от ли try оператор завершается обычно или резко (в результате метода BufferedReader.readLine бросок IOException).

До Java SE 7, можно использовать a finally блок, чтобы гарантировать, что ресурс закрывается независимо от ли try оператор завершается обычно или резко. Следующий пример использует a finally блок вместо a try- оператор с ресурсами:

static String readFirstLineFromFileWithFinallyBlock(String path)
                                                     throws IOException {
    BufferedReader br = new BufferedReader(new FileReader(path));
    try {
        return br.readLine();
    } finally {
        if (br != null) br.close();
    }
}

Однако, в этом примере, если методы readLine и close оба выдают исключения, тогда метод readFirstLineFromFileWithFinallyBlock выдает исключение, брошенное от finally блок; исключение, выданное от try блок подавляется. Напротив, в примере readFirstLineFromFile, если исключения выдаются от обоих try блок и try- оператор с ресурсами, тогда метод readFirstLineFromFile выдает исключение, брошенное от try блок; исключение, выданное от try- блок с ресурсами подавляется. В Java SE 7 и позже, можно получить заблокированные исключительные ситуации; см. Заблокированные исключительные ситуации раздела для получения дополнительной информации.

Можно объявить один или более ресурсов в a try- оператор с ресурсами. Следующий пример получает имена файлов, упакованных в файле zip zipFileName и создает текстовый файл, который содержит имена этих файлов:

public static void writeToFileZipFileContents(String zipFileName,
                                           String outputFileName)
                                           throws java.io.IOException {

    java.nio.charset.Charset charset =
         java.nio.charset.StandardCharsets.US_ASCII;
    java.nio.file.Path outputFilePath =
         java.nio.file.Paths.get(outputFileName);

    // Open zip file and create output file with 
    // try-with-resources statement

    try (
        java.util.zip.ZipFile zf =
             new java.util.zip.ZipFile(zipFileName);
        java.io.BufferedWriter writer = 
            java.nio.file.Files.newBufferedWriter(outputFilePath, charset)
    ) {
        // Enumerate each entry
        for (java.util.Enumeration entries =
                                zf.entries(); entries.hasMoreElements();) {
            // Get the entry name and write it to the output file
            String newLine = System.getProperty("line.separator");
            String zipEntryName =
                 ((java.util.zip.ZipEntry)entries.nextElement()).getName() +
                 newLine;
            writer.write(zipEntryName, 0, zipEntryName.length());
        }
    }
}

В этом примере, try- оператор с ресурсами содержит два объявления, которые разделяются точкой с запятой: ZipFile и BufferedWriter. Когда блок кода, который непосредственно следует за этим, завершается, или обычно или из-за исключения, close методы BufferedWriter и ZipFile объекты автоматически вызывают в этом порядке. Отметьте что close методы ресурсов вызывают в противоположном порядке их создания.

Следующий пример использует a try- оператор с ресурсами, чтобы автоматически закрыть a java.sql.Statement объект:

public static void viewTable(Connection con) throws SQLException {

    String query = "select COF_NAME, SUP_ID, PRICE, SALES, TOTAL from COFFEES";

    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");
            int sales = rs.getInt("SALES");
            int total = rs.getInt("TOTAL");

            System.out.println(coffeeName + ", " + supplierID + ", " + 
                               price + ", " + sales + ", " + total);
        }
    } catch (SQLException e) {
        JDBCTutorialUtilities.printSQLException(e);
    }
}

Ресурс java.sql.Statement используемый в этом примере часть JDBC 4.1 и более позднего API.

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

Заблокированные исключительные ситуации

Исключение может быть выдано от блока кода, связанного с try- оператор с ресурсами. В примере writeToFileZipFileContents, исключение может быть выдано от try блок, и до двух исключений могут быть брошены от try- оператор с ресурсами, когда это пытается закрыться ZipFile и BufferedWriter объекты. Если исключение выдается от try блок и одно или более исключений бросаются от try- оператор с ресурсами, тогда те исключения, выданные от try- оператор с ресурсами подавляется, и исключение, выданное блоком, является тем, которое бросается writeToFileZipFileContents метод. Можно получить эти заблокированные исключительные ситуации, вызывая Throwable.getSuppressed метод от исключения, выданного try блок.

Классы, Которые Реализуют Интерфейс AutoCloseable или Closeable

См. Javadoc AutoCloseable и Closeable интерфейсы для списка классов, которые реализуют любой из этих интерфейсов. Closeable интерфейс расширяется AutoCloseable интерфейс. close метод Closeable интерфейс выдает исключения типа IOException в то время как close метод AutoCloseable интерфейс выдает исключения типа Exception. Следовательно, подклассы AutoCloseable интерфейс может переопределить это поведение close метод, чтобы выдать специализированные исключения, такой как IOException, или никакое исключение вообще.


Проблемы с примерами? Попытайтесь Компилировать и Выполнить Примеры: FAQ.
Жалобы? Поздравление? Предложения? Дайте нам свою обратную связь.

Предыдущая страница: наконец Блок
Следующая страница: Соединение Всего этого