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


目录
相关文章
|
3月前
|
Kotlin
Kotlin协程的取消机制:深入理解和优雅实现
本文详细探讨了Kotlin协程的取消机制,介绍了除直接使用`Job`的`cancel`方法外的多种优雅实现策略,如`CompletableDeferred`、`isActive`检查、`ensureActive`、`yield`及`CoroutineScope`的取消等。通过这些方法,可以更好地管理协程生命周期,确保资源正确释放,提升代码健壮性和可维护性。
88 12
|
4月前
|
存储 前端开发 JavaScript
javascript 异常问题之为自定义异常提供丰富的上下文信息如何实现
javascript 异常问题之为自定义异常提供丰富的上下文信息如何实现
|
4月前
|
Java 开发者
Java中的异常处理:深入探讨try-with-resources语句
【8月更文挑战第13天】在Java的世界中,异常处理是维护程序健壮性的关键环节。随着语言的发展,新的异常处理机制被引入以简化代码和提高资源管理的效率。本文将深入探讨try-with-resources语句,一种旨在简化资源管理的异常处理结构,它如何改变了我们处理资源的模式,以及这一机制背后的核心原理和实际应用中的最佳实践。
|
7月前
|
JSON Java 数据格式
SpringBoot - 错误处理机制与自定义错误处理实现
SpringBoot - 错误处理机制与自定义错误处理实现
53 0
|
JavaScript 前端开发
带你读《现代Javascript高级教程》二十五、JavaScript Error 类: 异常处理与错误管理(2)
带你读《现代Javascript高级教程》二十五、JavaScript Error 类: 异常处理与错误管理(2)
|
JavaScript 前端开发 API
带你读《现代Javascript高级教程》二十五、JavaScript Error 类: 异常处理与错误管理(1)
带你读《现代Javascript高级教程》二十五、JavaScript Error 类: 异常处理与错误管理(1)
从try-with-resources到ThreadLocal,优化你的代码编写方式!
10个Java编码小技巧,涉及到代码复用、异常处理、集合操作、字符串处理等方面。其中包括使用Lambda表达式简化代码、使用try-with-resources自动关闭资源等。
Yii2如何进行代码风格检查?底层原理是什么?
Yii2如何进行代码风格检查?底层原理是什么?
|
安全 搜索推荐 数据库
Yii2的错误处理机制是什么?底层原理是什么?
Yii2的错误处理机制是什么?底层原理是什么?
|
Dart JavaScript
[Flutter]足够入门的Dart语言系列之流程控制语句:中断和异常(continue/break、try...catch)
循环的执行是通过循环条件来控制的,但是,有时我们想要通过额外的条件判断,来决定是否中断执行,或者中断本次循环而继续执行下次及之后的循环;此外,我们需要对于异常情况的处理...
467 0
[Flutter]足够入门的Dart语言系列之流程控制语句:中断和异常(continue/break、try...catch)