autocoding java_javaIO——AutoCloseable 小试

前面在 IO 概述篇提到过,AutoCloseable 接口类会自动调用 close() 方法,那究竟具体怎么写呢?以及发生异常情况下或者多个资源是不是都能自动调用呢?我们来写一个简单的类测试一下就知道了。

测试代码:

package com.one.jdksrc.java.io;

import java.io.Closeable;

import java.io.IOException;

/**

* @author haoya_Coding_one

* @version 1.0

* @create 2019/8/13 9:32

* @description TODO

*/

public class CloseableTest {

public static void main(String[] args){

System.out.println("------------------在 try{} 中声明不会调用-----------------------");

try {

HowToAutoClose howToAutoClose = new HowToAutoClose("1");

howToAutoClose.doNothing();

}catch (Exception ex){

System.out.println(ex.getMessage());

}

System.out.println("------------------在 try() 中声明会调用-----------------------");

try(HowToAutoClose howToAutoClose = new HowToAutoClose("1")) {

howToAutoClose.doNothing();

}catch (Exception ex){

System.out.println(ex.getMessage());

}

System.out.println("------------------出现异常情况下仍然会调用,并且是先调用close再捕获异常-----------------------");

try(HowToAutoClose howToAutoClose = new HowToAutoClose("1")) {

howToAutoClose.doNothing();

throw new NullPointerException("这是异常信息");

}catch (Exception ex){

System.out.println(ex.getMessage());

}

System.out.println("------------------所有资源都会调用,顺序与声明的顺序相逆-----------------------");

try(HowToAutoClose howTo1 = new HowToAutoClose("1");

HowToAutoClose howTo2 = new HowToAutoClose("2");

HowToAutoClose howTo3 = new HowToAutoClose("3")) {

//测试多个资源时是否都调用,以及调用顺序

}catch (Exception ex){

System.out.println(ex.getMessage());

}

System.out.println("------------------try{} 中 return 也会调用-----------------------");

try(HowToAutoClose howToAutoClose = new HowToAutoClose("1")) {

howToAutoClose.doNothing();

return;

}catch (Exception ex){

System.out.println(ex.getMessage());

}

}

public static class HowToAutoClose implements Closeable {

private String param = null;

public HowToAutoClose(String integer){

param = integer;

}

public void doNothing(){

}

@Override

public void close() throws IOException {

System.out.println(param);

}

}

}

运行结果:

b774a6c4e496d5e9a26d787aba18d4b3.png

结论:

1. 资源类需要声明在 try() 小括号内;

2. try(){} 大括号代码块中发生 异常或者 return,依然会自动调用 close() 方法;

3. 可以声明多个资源类实例,使用 “;” 分隔即可,且多个资源实例会逆序调用(其实只要都能调用,顺序并不重要);

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值