Java 7中的Try-with-resources

简介:

原文链接 作者:Jakob Jenkov 译者:fangqiang08(fangqiang08@gmail.com)
Try-with-resources是java7中一个新的异常处理机制,它能够很容易地关闭在try-catch语句块中使用的资源。

利用Try-Catch-Finally管理资源(旧的代码风格)

在java7以前,程序中使用的资源需要被明确地关闭,这个体验有点繁琐。

下面的方法读取文件,然后用System.out打印:


private static void printFile() throws IOException {
    InputStream input = null;

    try {
        input = <strong>new FileInputStream("file.txt")</strong>;

        int data = <strong>input.read()</strong>;
        while(data != -1){
            System.out.print((char) data);
            data = <strong>input.read()</strong>;
        }
    } finally {
        if(input != null){
            <strong>input.close()</strong>;
        }
    }
}


上面代码中黑体字的程序可能会抛出异常。正如你所看到的,try语句块中有3个地方能抛出异常,finally语句块中有一个地方会能出异常。

不论try语句块中是否有异常抛出,finally语句块始终会被执行。这意味着,不论try语句块中发生什么,InputStream 都会被关闭,或者说都会试图被关闭。如果关闭失败,InputStream’s close()方法也可能会抛出异常。

假设try语句块抛出一个异常,然后finally语句块被执行。同样假设finally语句块也抛出了一个异常。那么哪个异常会根据调用栈往外传播?

即使try语句块中抛出的异常与异常传播更相关,最终还是finally语句块中抛出的异常会根据调用栈向外传播。

在java7中,对于上面的例子可以用try-with-resource 结构这样写:


private static void printFileJava7() throws IOException {

    try(FileInputStream input = new FileInputStream("file.txt")) {

        int data = input.read();
        while(data != -1){
            System.out.print((char) data);
            data = input.read();
        }
    }
}


注意方法中的第一行:


try(FileInputStream input = new FileInputStream("file.txt")) {


这就是try-with-resource 结构的用法。FileInputStream 类型变量就在try关键字后面的括号中声明。而且一个FileInputStream 类型被实例化并被赋给了这个变量。

当try语句块运行结束时,FileInputStream 会被自动关闭。这是因为FileInputStream 实现了java中的java.lang.AutoCloseable接口。所有实现了这个接口的类都可以在try-with-resources结构中使用。

当try-with-resources结构中抛出一个异常,同时FileInputStreami被关闭时(调用了其close方法)也抛出一个异常,try-with-resources结构中抛出的异常会向外传播,而FileInputStreami被关闭时抛出的异常被抑制了。这与文章开始处利用旧风格代码的例子(在finally语句块中关闭资源)相反。

使用多个资源

你可以在块中使用多个资源而且这些资源都能被自动地关闭。下面是例子:


private static void printFileJava7() throws IOException {

    try(  FileInputStream     input         = new FileInputStream("file.txt");
          BufferedInputStream bufferedInput = new BufferedInputStream(input)
    ) {

        int data = bufferedInput.read();
        while(data != -1){
            System.out.print((char) data);
    data = bufferedInput.read();
        }
    }
}


上面的例子在try关键字后的括号里创建了两个资源——FileInputStream 和BufferedInputStream。当程序运行离开try语句块时,这两个资源都会被自动关闭。

这些资源将按照他们被创建顺序的逆序来关闭。首先BufferedInputStream 会被关闭,然后FileInputStream会被关闭。

自定义AutoClosable 实现

这个try-with-resources结构里不仅能够操作java内置的类。你也可以在自己的类中实现java.lang.AutoCloseable接口,然后在try-with-resources结构里使用这个类。

AutoClosable 接口仅仅有一个方法,接口定义如下:


public interface AutoClosable {

    public void close() throws Exception;
}


任何实现了这个接口的方法都可以在try-with-resources结构中使用。下面是一个简单的例子:


public class MyAutoClosable implements AutoCloseable {

    public void doIt() {
        System.out.println("MyAutoClosable doing it!");
    }

    @Override
    public void close() throws Exception {
        System.out.println("MyAutoClosable closed!");
    }
}


doIt()是方法不是AutoClosable 接口中的一部分,之所以实现这个方法是因为我们想要这个类除了关闭方法外还能做点其他事。

下面是MyAutoClosable 在try-with-resources结构中使用的例子:


private static void myAutoClosable() throws Exception {

    try(MyAutoClosable myAutoClosable = new MyAutoClosable()){
        myAutoClosable.doIt();
    }
}


当方法myAutoClosable.doIt()被调用时,下面是打印到System.out的输出:


MyAutoClosable doing it!
MyAutoClosable closed!


通过上面这些你可以看到,不论try-catch中使用的资源是自己创造的还是java内置的类型,try-with-resources都是一个能够确保资源能被正确地关闭的强大方法。 

目录
相关文章
|
17天前
|
Java 编译器 开发者
Java异常处理的最佳实践,涵盖理解异常类体系、选择合适的异常类型、提供详细异常信息、合理使用try-catch和finally语句、使用try-with-resources、记录异常信息等方面
本文探讨了Java异常处理的最佳实践,涵盖理解异常类体系、选择合适的异常类型、提供详细异常信息、合理使用try-catch和finally语句、使用try-with-resources、记录异常信息等方面,帮助开发者提高代码质量和程序的健壮性。
35 2
|
3月前
|
Java 开发者
Java中的异常处理:深入探讨try-with-resources语句
【8月更文挑战第13天】在Java的世界中,异常处理是维护程序健壮性的关键环节。随着语言的发展,新的异常处理机制被引入以简化代码和提高资源管理的效率。本文将深入探讨try-with-resources语句,一种旨在简化资源管理的异常处理结构,它如何改变了我们处理资源的模式,以及这一机制背后的核心原理和实际应用中的最佳实践。
|
3月前
|
Java 数据库连接 开发者
Java中的异常处理:深入理解try-with-resources语句
在Java的编程世界中,异常处理是维护应用程序健壮性不可或缺的一环。随着语言的发展,try-with-resources语句成为了优雅管理资源的新宠。本文将带你领略这一特性的魅力,从基本用法到背后的原理,再到实际应用案例,让你对try-with-resources有一个全面而深入的理解。
|
3月前
|
Java 数据库连接 开发者
Java中的异常处理:深入探索try-with-resources语句
在Java的世界中,异常处理是代码健壮性的基石之一。随着语言的发展,新的异常处理特性不断涌现,其中最为引人注目的便是try-with-resources语句。这一创新不仅简化了资源管理,还提升了代码的可读性和效率。本文将揭开try-with-resources的神秘面纱,探讨其背后的原理、使用方法及其带来的变革。
47 3
|
4月前
|
安全 Java 数据库连接
Java中的异常处理:深入理解try-with-resources语句
在Java的异常处理领域,try-with-resources语句是一个重要的特性,它简化了资源管理并提高了代码的可读性。本文将详细探讨try-with-resources的工作原理、使用场景以及如何正确运用这一结构来优化资源管理,同时指出常见的误用情况和最佳实践。
125 0
|
6月前
|
Java 数据库连接 开发者
Java中的异常处理:探究try-with-resources
【2月更文挑战第13天】 在Java编程语言中,异常处理是确保代码健壮性和稳定性的关键机制。传统的try-catch-finally模式虽然功能强大,但在处理资源关闭方面存在一定的繁琐性和复杂度。Java 7引入的try-with-resources语句,旨在简化这一过程,通过自动管理资源的关闭过程,提高代码的可读性和可维护性。本文将深入探讨try-with-resources的工作原理、使用方式及其带来的好处,并通过对比分析展示其相比传统异常处理模式的优势。
|
6月前
|
Java 数据库连接
Java异常处理:什么是try-with-resources语句?
Java异常处理:什么是try-with-resources语句?
114 0
|
安全 Java 数据库连接
面试官,说说Java的try-with-resources
面试官,说说Java的try-with-resources
95 0
|
安全 Java
Java语法糖 : 使用 try-with-resources 语句安全地释放资源
使用 try-with-resources 语句自动关闭资源的类都实现了AutoCloseable 接口。
281 0
Java语法糖 : 使用 try-with-resources 语句安全地释放资源
java7 try-with-resources 很香
java7 try-with-resources 很香
下一篇
无影云桌面