其他分享
首页 > 其他分享> > 学习异常处理-自动关闭资源的try语句块

学习异常处理-自动关闭资源的try语句块

作者:互联网

 

/**
六 java9增强的自动关闭资源的try语句块(java7事实上已经有了自动关闭try语句块)
    写法: try(){}-catch-finally
    综上:需要关闭的资源,数据库连接,网络连接
        1 要么在小括号里声明且初始化(java7)注意'且'字
        2 (推荐)要么在try自动关闭语句之前初始化,然后再try的小括号的声明一下即可,多个资源需要分号间隔(java9增强)
         java9解释: 资源变量必须为final的. 要么必须要么final显式声明类型,要么是隐式final修饰(小括号里声明即成了被隐式final修饰)
    注意:
        1 为保证正常关闭,这些资源类必须实现AutoCloseable或Closeable接口,事实上java的这些资源类已经实现了)
        2 自动关闭try语句块,其实相当于包含了隐式的finally语句块,所以它可以没有catch和finally,亦可以包含
*/    
import java.io.*;
public class 异常处理 {
    public static void main(String[] args) throws Exception {
        //隐式final修饰((java9))
        //变量只要被try的小括号里被访问即即相当于被隐式final的修饰了,因此资源无需显示的final修饰
        //如下证明,hobby没有使用final修饰
         var hobby1 = new StringReader("吃饭了");//StringReader为字符串输入流,read()一次读取一个字符
        try ( hobby1){
            System.out.println((char)hobby1.read());//吃
        }
//        System.out.println((char)hobby1.read());
// 上面语句报错,说明hobby资源已经关闭.try自动关闭资源生效了.印证了hobby在try小括号里访问后被隐式final的修饰了

//        如下显式的使用final修饰资源(java9)
        final var hobby2 = new StringReader("吃饭了");//StringReader为字符串输入流,read()一次读取一个字符
        try ( hobby2){
            System.out.println((char)hobby2.read());//吃
        }
//        System.out.println((char)hobby2.read());
//        上面语句报错,说明hobby资源已经关闭.try自动关闭资源生效了

        //在小括号里初始化(java7)
        StringReader test = null;//先声明一个变量,因为下面的hobby为try语句块局部变量,外面无法访问,导致无法测试
        //StringReader为字符串输入流,read()一次读取一个字符
        try ( StringReader hobby3 = new StringReader("吃饭了")){
            System.out.println((char)hobby3.read());//吃
            test = hobby3;
        }
//        System.out.println((char)test.read());
//        上面语句报错,说明hobby资源已经关闭.try自动关闭资源生效了
    }
}

运行结果:



标签:语句,read,StringReader,try,关闭,final
来源: https://www.cnblogs.com/runwithtime/p/16282671.html