`

Java之Java7新特性之try资源句式

阅读更多
Java之Java7新特性之try资源句式

一、【try资源句式】是干嘛用的?
在JDK 7版本中出现了一种新的句式: try(资源)

try资源 (try with resources) 句式是一个 try 句式,可以 try 一个或多个资源。
资源必须在用完后 close 掉。使用try资源句式可以自动 close 资源。

任何实现了 java.lang.AutoCloseable 接口的类
都可以使用 try资源句式,自动 close。
public interface java.io.Closeable extends java.lang.AutoCloseable

一句话:
使用 try资源句式 用来自动 close 资源。而不用担心资源一直占用内存无法释放。


二、使用语法 - 何时自动关闭资源
下面的例子用于读取文件的第一行。它使用一个 BufferedReader 的实例来读取数据。
BufferedReader 在这里就是一个资源,它必须在程序运行结束后被关闭。
static String readFirstLineFromFile(String path) throws IOException {
    try(
        BufferedReader br = new BufferedReader(new FileReader(path))
    ){
        return br.readLine();
    }
}

BufferedReader 在 jdk1.7 中实现了 java.lang.AutoCloseable 接口,
它将被自动关闭,无论是程序正常结束还是中途抛出异常。


三、异常是如何被抛出/捕获的?

try资源句式 其功能是用于资源的自动关闭,而对于异常的 catch 和 finally,
在写法上跟 jkd 1.7 之前没有区别。

在 jdk 1.7 之前,如果遇到异常,会写在 catch 中,然后在 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() 都抛出异常时,该方法抛出的异常是 finally 块中的异常,
try块中的异常被忽略了。


与之相反的是,try资源句式 则会抛出try块中的异常,try句式中的异常被忽略掉了。
当然你仍然可以在 catch() 块中获取到被忽略的异常。
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);
    }
}



四、可以 try 多个资源

使用 try资源句式 时,可以将多个资源写在一起,中间用分号隔开。
注意:
1、最后一个资源后面没有分号。
2、资源的关闭顺序跟写的顺序相反(最先打开的最后关闭)。
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资源句式 忽略的异常

前述已讲过,try{} 体中的异常会覆盖掉 try() 表达式中的异常。
但仍然可以通过 try{} 体中抛出的异常 和 Throwable.getSuppressed() 方法获取那些被忽略的异常。






-
转载请注明,
原文出处:http://lixh1986.iteye.com/blog/2370408







引用:

The try-with-resources Statement
https://docs.oracle.com/javase/tutorial/essential/exceptions/tryResourceClose.html




-

分享到:
评论

相关推荐

    java7新特性与java高级编程

    在这个主题中,我们将深入探讨Java 7的新特性以及Java的高级编程概念。 **1. 多线程并行流(Fork/Join框架)** Java 7引入了Fork/Join框架,这是一个用于执行分治算法的并行计算模型。它将大任务分解为小任务,并在...

    JAVA 7新特性1

    JAVA 7 中引入了多个新特性,其中之一是异常处理升级。在 Java 7 中,catch 代码块得到了升级,可以在单个 catch 块中处理多个异常。这种特性可以减少代码重复度,并生成更少的字节码。 在 Java 7 之前的版本中,...

    18.java自动关闭资源的try语句.zip

    18.java自动关闭资源的try语句.zip18.java自动关闭资源的try语句.zip18.java自动关闭资源的try语句.zip18.java自动关闭资源的try语句.zip18.java自动关闭资源的try语句.zip18.java自动关闭资源的try语句.zip18.java...

    Java异常处理新特性

    Java 异常处理新特性是在 Java7 中引入的一种新的异常处理机制,它提供了一种更加简洁、可靠的方式来处理资源使用异常。这种机制称为 try-with-resources,实际上是自动调用资源的 close() 函数,从而实现资源的自动...

    java try…catch嵌套捕获异常的实例

    总结来说,`try-catch`嵌套在Java中用于更精细化的异常处理,允许我们针对不同类型的异常执行不同的恢复策略。通过这种方式,我们可以编写更健壮、更易维护的代码,确保程序在面对错误时能够优雅地处理并继续运行。

    java1.7 特性实现

    Java 7引入了一个新的语法结构——`try-with-resources`,用于更有效地管理资源,特别是那些实现了`AutoCloseable`接口的类,如文件流或数据库连接。这确保了在try块结束后,资源会自动关闭,避免了资源泄露的问题...

    java7 新技术代码示例

    Java 7引入了try-with-resources语句,使得资源可以在块的结尾自动关闭,无需显式调用close()方法。例如: ```java try (InputStream in = new FileInputStream("file.txt")) { // 读取文件操作 } // 在这里,in会...

    java进阶/JDK 7、8新特性

    总的来说,JDK 7和8的新特性显著增强了Java的生产力和代码质量,使得开发者能够更好地应对现代软件开发的挑战。通过学习和掌握这些特性,Java程序员可以编写出更加高效、易读和维护的代码。对于希望进一步提升Java...

    jdk7最新特性-trywresources

    JDK7是一个重要的版本更新,它引入了许多新特性以提高代码的可读性、安全性和效率。其中,“try-with-resources”是JDK7中的一个显著特性,它对处理资源管理的方式进行了革新,尤其是在处理诸如文件流、数据库连接等...

    java7新特性功能表

    Java 7,全称为Java SE 7 (Java Platform, Standard Edition 7),是Java编程语言的一个重大更新,它在2011年发布,引入了一系列的新特性,旨在提高开发效率,增强程序性能,并且简化某些编程任务。让我们深入探讨...

    java7 32位版

    Java 7,又称为Java SE 7 (Java Standard Edition 7),是Java的重要里程碑,它在2011年发布,带来了许多新特性和性能优化。以下是一些关键的Java 7特性: 1. **多语言支持**:Java 7引入了新的`try-with-resources`...

    Java7 新特性

    ### Java 7 新特性详解 #### 一、二进制字面值(Binary Literals) Java 7 引入了一项非常实用的新特性——**二进制字面值**。这使得开发者可以直接使用二进制形式表示整型常量,提高了代码的可读性和直观性。 ####...

    java try…catch捕获异常的实例

    在Java编程语言中,异常处理是一项关键特性,用于在程序执行过程中处理可能出现的错误或异常情况。`try-catch`块是Java异常处理的核心部分,它允许程序员在代码可能出现问题的地方进行异常捕获和处理,避免程序因未...

    2018最新 Java9新特性详解视频

    14.新特性7:异常处理try结构的使用升级 15.新特性8:下划线命名标识符的限制 16.新特性9:String底层存储结构的变化 17.新特性10:创建只读集合 18.新特性11:增强的Stream API 19.新特性11:Optional提供的stream...

    JAVA7新特性介绍(官方公布)中文版[参照].pdf

    Java 7是Java平台标准版的一个重要更新,它引入了一系列的新特性和改进,旨在提高开发者的效率、增强程序性能以及扩展平台的可用性。以下是Java 7的一些关键新特性: 1. **Nimbus Look & Feel**: Java 7引入了...

    java7入门经典完全扫描版百度网盘下载地址

    ### Java 7的新特性 #### 1. **多捕获** Java 7引入了多捕获机制,允许在一个catch块中处理多种类型的异常,极大地简化了代码的编写。 #### 2. **自动资源管理** Java 7中的try-with-resources语句可以自动关闭...

    java中try catch的用法

    ### Java中try-catch的用法详解 #### 一、基本概念 在Java编程语言中,`try-catch`结构是一种用于处理程序运行时可能出现的异常情况的重要机制。通过使用`try-catch`块,开发者可以更加精细地控制程序的行为,并...

    《疯狂Java讲义》随书光盘

    本书深入介绍了Java编程的相关方面,全书内容覆盖了Java的基本语法结构、Java的...本书全面介绍了Java7的二进制数、棱形语法、增强switch语句、多异常捕获、自动关闭资源的try语句、JDBC4.1新特性、NIO.2、AIO等新特性

Global site tag (gtag.js) - Google Analytics