java7新特性之Try-with-resources statement
try-with-resources 語句是一個聲明了1到多個資源的try語句。資源是指這個try執行完成后必需close掉的對象,比如connection, resultset等。
try-with-resources 語句會確保在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();
}
}
在這個例子里面,資源是一個BufferedReader, 聲明語句是在try后面的括號內。在java7或更晚的版本中,BufferedReader實現了java.lang.AutoCloseable接口。由于BufferedReader被定義在try-with-resource 語句中,因此不管try代碼塊是正常完成或是出現異常,這個BufferedReader?的實例都將被關閉。
在java7之前的版本中,你可以使用finally 代碼塊來確保資源被關閉(不管try正常完成還是出現異常)。下面是使用finally的例子:
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代碼塊里面的異常,也就是close方法出現的異常,try代碼塊里面的異常被禁止;相反,在readFirstLineFromFile這個例子中,如果try?代碼塊和try-with-resources 語句都出現異常,readFirstLineFromFile?方法將出拋出來自try代碼塊的異常,從try-with-resources拋出的異常被禁止。在java7或更晚的版本中,我們可以獲取到這些被禁止的異常。
你可以聲明1到多個資源,看下面的例子
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());
}
}
}
?
在這個例子中,有兩個資源,資源之間用分號隔開。資源被關閉的順序與它們被創建的順序相反,也就是說writer 先被關閉,接著是zf。
?下面我們使用try-with-resources 語句自動關閉一個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?是JDBC4.1或更晚的API的一部分。
注意:try-with-resources 也可以有catch和finally語句塊,就像使用一個普通的try語句一樣。在try-with-resources 語句中,catch或者finally將在資源被關閉后執行。
from:https://blog.csdn.net/fireofjava/article/details/7220754?
總結
以上是生活随笔為你收集整理的java7新特性之Try-with-resources statement的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Java SE7新特性之try-with
- 下一篇: Java 7中的Try-with-res