try with resources简洁的异常捕获机制

简介: try with resources简洁的异常捕获机制

通过前篇的《Java文件IO流的操作总结》,我们知道了基本输入输出流的使用方式,但是每次都需要在finally处关闭流资源,这样操作起来既啰嗦又麻烦,有没有更简洁的方式呢?本篇就来讲解jdk1.7引入的try with resources语法糖式写法。

什么是语法糖

1.之所以称之为语法糖,给人的感觉就是很甜,很甜。

2.在相同功能下,语法糖的写法会让代码更加简洁流畅,代码更加语义自然。

3.通过编译器在编译期间以特定的字节码或者特定的方式对这些语法做一些处理

4.语法糖虽然不会提供实质性的功能改进,但是它们或能提高性能、或能提升语法的严谨性、或能减少编码出错的机会。

使用try with resources捕获异常

待读取的文件内容

示例代码

package com.lingyejun.io;
import java.io.*;
/**
 * Created by Lingye on 2018/9/28 15:03
 */
public class SyntacticSugarTry {
    // 调用有finally的case值
    public static final int OLD_TRY = 1;
    // 调用新式语法糖式的case值
    public static final int SUGAR_TRY = 2;
    /**
     * 根据输入参数执行不同方法
     *
     * @param type
     * @return
     */
    public InputStream invokeTry(int type) {
        InputStream inputStream = null;
        switch (type) {
            case OLD_TRY:
                inputStream = oldTryCatch();
                break;
            case SUGAR_TRY:
                inputStream = newTryCatch();
                break;
            default:
                System.out.println("error type");
        }
        return inputStream;
    }
    /**
     * 采用旧式的finally写法
     *
     * @return
     */
    public InputStream oldTryCatch(){
        // 构建文件对象
        File inputFile = new File("D:\\input.txt");
        // 初始化输入流
        InputStream inputStream = null;
        try {
            // 创建字节输入流
            inputStream = new FileInputStream(inputFile);
            // 读取到1KB字节数组中
            byte[] buffer = new byte[12];
            // 读取数据并放到buffer数组中
            inputStream.read(buffer);
            System.out.println("oldTryCatch读取输出"+new String(buffer));
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            if (inputStream != null) {
                try {
                    // 关闭流过程,也有可能出现异常
                    inputStream.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }
        return inputStream;
    }
    /**
     * 采用语法糖式写法
     *
     * @return
     */
    public InputStream newTryCatch() {
        // 构建文件对象
        File inputFile = new File("D:\\input.txt");
        // 初始化输入流
        InputStream returnStream = null;
        // try with resource 语法糖式写法
        try (InputStream inputStream = new FileInputStream(inputFile)) {
            byte[] buffer = new byte[12];
            inputStream.read(buffer);
            System.out.println("newTryCatch读取输出"+new String(buffer));
            returnStream = inputStream;
        } catch (Exception e) {
            e.printStackTrace();
        }
        // 省略了繁琐的finally
        return returnStream;
    }
    public static void main(String[] args) {
        SyntacticSugarTry sugarTry = new SyntacticSugarTry();
        InputStream oldStream = sugarTry.invokeTry(OLD_TRY);
        InputStream sugarStream = sugarTry.invokeTry(SUGAR_TRY);
        // 检查流是否正常关闭
        try {
            // 再次尝试读取,检查是否关闭
            oldStream.read();
        } catch (IOException e) {
            // 已关闭
            System.out.println("oldStream 输入流已关闭");
        }
        try {
            // 再次尝试读取,检查是否关闭
            sugarStream.read();
        } catch (IOException e) {
            // 已关闭
            System.out.println("sugarStream 输入流已关闭");
        }
    }
}

查看文件管道的关闭情况

语法糖式写法,执行完毕后自动关闭输入流

查看输出结果

 

不难看出,语法糖的使用其实就是让我们的写的代码更简单,看起来也更容易理解。

使用原理

语法糖是一种几乎每种语言或多或少都提供过的一些方便程序员开发代码的语法,它只是编译器实现的一些小把戏罢了,编译期间以特定的字节码或者特定的方式对这些语法做一些处理,开发者就可以直接方便地使用了。这些语法糖虽然不会提供实质性的功能改进,但是它们或能提高性能、或能提升语法的严谨性、或能减少编码出错的机会。

使用JD-GUI打开上面类的.class编译文件后会发现编译过后,编译器给我们自动加上了资源流的close关闭动作(81行、95行)。

+ View Code

参考文章:

https://www.cnblogs.com/jiumao/p/7136369.html

https://blog.csdn.net/Merlin2017/article/details/78075206


目录
相关文章
|
5月前
|
JSON Java 数据格式
SpringBoot - 错误处理机制与自定义错误处理实现
SpringBoot - 错误处理机制与自定义错误处理实现
27 0
|
10月前
|
运维 Prometheus 监控
java异常 | 处理规范、全局异常、Error处理
java异常 | 处理规范、全局异常、Error处理
|
6月前
|
Java UED
异常处理:让你的代码更加健壮
异常处理:让你的代码更加健壮
|
11月前
|
安全 Java 微服务
SpringBoot 中如何优雅地处理异常,包括异常处理机制、全局异常处理器、自定义异常?
SpringBoot 中如何优雅地处理异常,包括异常处理机制、全局异常处理器、自定义异常?
161 0
|
11月前
|
Java API
从try-with-resources到ThreadLocal,优化你的代码编写方式!
10个Java编码小技巧,涉及到代码复用、异常处理、集合操作、字符串处理等方面。其中包括使用Lambda表达式简化代码、使用try-with-resources自动关闭资源等。
|
安全 搜索推荐 数据库
Yii2的错误处理机制是什么?底层原理是什么?
Yii2的错误处理机制是什么?底层原理是什么?
|
PHP 数据安全/隐私保护
Laravel 8 新特性之:优化维护模式、闭包分发和链式catch
Laravel 8 通过引入 Laravel Jetstream,模型工厂类,迁移压缩,队列批处理,改善速率限制,队列改进,动态 Blade 组件,Tailwind 分页视图, 时间测试助手,artisan serve 的改进,事件监听器的改进,以及各种其他错误修复和可用性改进,对 Laravel 7.x 继续进行了改善。
102 0
|
JavaScript 前端开发 Dubbo
断言+异常处理类,代码更简洁了
断言+异常处理类,代码更简洁了
|
前端开发
手写promise完成异常处理和状态只能够修改一次
手写promise完成异常处理和状态只能够修改一次