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
ключевое слово. Класс 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.Charset.forName("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
блок.
См. Javadoc AutoCloseable
и Closeable
интерфейсы для списка классов, которые реализуют любой из этих интерфейсов. Closeable
интерфейс расширяется AutoCloseable
интерфейс. close
метод Closeable
интерфейс выдает исключения типа IOException
в то время как close
метод AutoCloseable
интерфейс выдает исключения типа Exception
. Следовательно, подклассы AutoCloseable
интерфейс может переопределить это поведение close
метод, чтобы выдать специализированные исключения, такой как IOException
, или никакое исключение вообще.