• javaIO——AutoCloseable 小试


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

      概述片地址:https://www.cnblogs.com/coding-one/p/11342024.html

      测试代码:

    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);
    }
    }
    }

      运行结果:

      

      结论:

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

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

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

  • 相关阅读:
    设计模式-代理模式
    设计模式-桥接模式
    设计模式-组合模式
    设计模式-享元模式
    设计模式-适配器模式
    设计模式-装饰器模式
    设计模式-外观模式
    redis日志格式
    Linux下的文件切割和文件合并
    Windows server 服务器的端口突然远程连不上了,但是可以远程连接,怎么回事?
  • 原文地址:https://www.cnblogs.com/coding-one/p/11368653.html
Copyright © 2020-2023  润新知