try-with-resources的使用场景与实际应用

1、开篇,实际try-with-resources使用如下:

/**
     * 将二进制文件读取出来
     *
     * @param filePath 文本绝对路径
     * @return
     * @throws FileNotFoundException
     * @throws IOException
     */
    public static byte[] getReaderToBinary(String filePath) throws FileNotFoundException, IOException {

        int bufferSize = 4096; // 设置缓冲区大小
        byte buffer[] = new byte[bufferSize]; // 缓冲区字节数组
        File sourceFile = new File(filePath);
        byte[] b = null;
        try(InputStream fis = new FileInputStream(sourceFile);
            BufferedInputStream bis = new BufferedInputStream(fis, bufferSize);
            ) {
            int len = bis.available();
            b = new byte[len];
            bis.read(b, 0, len);
        }

        return b;
    }

上述例子参考地址:

     * 作者:这个人太懒了
     * 来源:CSDN
     * 原文:https://blog.csdn.net/qq_35546153/article/details/83421506
     * 版权声明:本文为博主原创文章,转载请附上博文链接!

之前,采用try-catch-finally,则较为繁琐不直观,甚至偶尔会忘记将其关闭,如下:

	InputStream fis = null;
        BufferedInputStream bis = null;

        try{
            fis = new FileInputStream(sourceFile);
            bis = new BufferedInputStream(fis, bufferSize);

            int len = bis.available();
            b = new byte[len];
            bis.read(b, 0, len);
        }finally {
            if(fis != null){
                fis.close();
            }
            if(bis != null){
                bis.close();
            }
        }

2、使用场景

try-with-resources的用法就是,在try关键字的后面跟一个括号,把需要关闭的资源定义在括号内。在try块执行完之后会自动的释放掉资源。

但是必须注意,并不是所有的期望关闭的代码都可以放进其中,只有实现了java.lang.AutoCloseable接口的类,才可以被自动关闭。

eg:上述代码示例中的 InputStream,其定义如下:

public abstract class InputStream implements Closeable

Closeable,其定义如下(from jdk1.5版本):

/**
 * A {@code Closeable} is a source or destination of data that can be closed.
 * The close method is invoked to release resources that the object is
 * holding (such as open files).
 *
 * @since 1.5
 */
public interface Closeable extends AutoCloseable

说明:

  • 1、try-with-resource语法是自 JDK7 新增的。
  • 2、其只是一个语法糖:当你将上面代码反编译后会发现,其实对JVM虚拟机而言,它看到的依然是之前的try-catch-finally写法

3、实际使用

场景以 打开了外部资源 居多:

  • 文件
  • 数据库连接
  • 网络连接

若有自定义的需求:

public class CustomResource implements java.lang.AutoCloseable {

    @Override
    public void close() {
        System.out.printf("调用了[%s]的close方法\n", this.getClass().getName());
    }


    public static void main(String[] args) {
        try (CustomResource customResource = new CustomResource();){
            // do something
            System.out.println("do something");
            throw new RuntimeException("测试抛出未知异常");
        }
    }
}

控制台输出如下:

do something
Exception in thread "main" java.lang.RuntimeException: 测试抛出未知异常
	at com.xxx.main(CustomResource.java:22)
调用了[com.xxx.CustomResource]的close方法

说明:即使try块中抛出异常,也不影响resource的关闭

4、其他要点

注意:

public class CustomResource implements java.lang.AutoCloseable {

    public CustomResource(){
        throw new RuntimeException("构造器异常:"+ this.getClass().getName());
    }
    @Override
    public void close() {
        System.out.printf("调用了[%s]的close方法\n", this.getClass().getName());
        throw new RuntimeException("close方法异常:"+ this.getClass().getName());
    }



    public static void main(String[] args) {
        try (CustomResource customResource = new CustomResource();){
            // do something
            System.out.println("do something");
        } catch (Exception e){
            System.out.println("do catch");
            e.printStackTrace();
        }
    }
}

控制台输出如下:

do catch
java.lang.RuntimeException: 构造器异常:com.xxx.CustomResource
	at com.xxx.CustomResource.<init>(CustomResource.java:13)
	at com.xxx.CustomResource.main(CustomResource.java:24)

解释说明(参考地址:https://www.cnblogs.com/itZhy/p/7636615.html):

try-with-resource时,如果对外部资源的处理和对外部资源的关闭均遭遇了异常,“关闭异常”将被抑制,“处理异常”将被抛出,但“关闭异常”并没有丢失,而是存放在“处理异常”的被抑制的异常列表中。

转载于:https://my.oschina.net/u/3136014/blog/3068521

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 在 Java 中,trytry() 的区别在于 try() 可以在 try 块结束后自动关闭资源,例如文件或网络连接。而 try 块中使用的资源需要手动关闭。因此,使用 try() 可以更方便地管理资源,避免资源泄漏的问题。 ### 回答2: 在Java中,try语句用于捕获可能发生异常的代码块,并提供相应的处理。try语句通常包括一个或多个catch语句和/或一个finally语句。 try{ }和try(){ }的区别在于括号的使用。在传统的try{ }语句中,大括号{}用于定义一个代码块,在代码块中编写可能抛出异常的代码。示例代码如下: ```java try { // 可能抛出异常的代码 } catch (Exception e) { // 异常处理 } finally { // 清理资源 } ``` 而在Java 7之后,还引入了一种新的try-with-resources语句,使用格式为try( ){ }。这种语句结构可以自动关闭资源(如文件或数据库连接),而无需手动在finally语句块中进行关闭操作,提供了更简洁和安全的资源管理方法。示例代码如下: ```java try (资源初始化) { // 可能抛出异常的代码 } catch (Exception e) { // 异常处理 } ``` 在try-with-resources语句中,资源的初始化是在try语句的括号中完成的。无论是否抛出异常,当try代码块执行完毕后,会自动关闭资源。catch语句仍然用于处理可能发生的异常。 因此,try{ }语句适用于一般的异常处理,而try( ){ }语句适用于需要自动关闭资源的情况。 ### 回答3: 在Java中,try-catch-finally 语句用于处理可能引发异常的代码块。它有两种形式:try{}和try(){}。 try{}是传统的try语句块形式,用于将可能抛出异常的代码包裹起来。catch子句用于捕获并处理try块中产生的异常。finally子句用于无论是否发生异常都会执行的代码。 try(){}是Java 7及更高版本引入的新特性,称为“带资源的try语句”。它用于在代码块结束后自动关闭资源,例如打开的文件、数据库连接等。资源对象必须实现AutoCloseable接口,该接口定义了close()方法用于关闭资源。 使用try-catch-finally时,如果try块中的代码引发异常,catch子句会捕获该异常并执行相应的处理逻辑。无论是否发生异常,finally子句中的代码都会执行。它通常用于释放资源、清理操作等。 而使用带资源的try语句时,try块中的资源会在代码块结束后自动关闭,无需手动调用close()方法。如果try块中产生异常,catch子句会捕获并处理异常,然后继续执行关闭资源的操作。finally子句在带资源的try语句中是可选的,一般不需要使用。 在使用带资源的try语句时,可以同时指定多个资源,资源之间用分号分隔。在代码块结束后,资源会按照其在try块中的声明顺序逆序关闭。 综上所述,try{}用于传统的异常处理,而try(){}用于自动关闭资源。两者的使用场景和功能不同,根据具体的需求和情况选择合适的处理方式。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值