美文网首页学习
try-catch-finally的执行顺序以及 try-wit

try-catch-finally的执行顺序以及 try-wit

作者: 坚持到底v2 | 来源:发表于2018-05-31 10:30 被阅读3次

    执行顺序是先 try或catch 然后是 finally,
    但是finally里的语句按定义是肯定要执行的,所以在代码最终要结束之前, 要先执行 finally 里的语句,然后回来再 return或throw ,
    这时候如果finally里的语句中包含了 return或throw 语句,那函数就在执行finally语句块的时候结束了,
    所以 极度不建议(甚至是禁止)在finally里写return语句。这点在Java自带的提示和各种代码扫描插件里都有体现。
    下面举几个例子:
    例子1:

    public static String method1() throws Exception {
        try {
            throw new Exception("myException");
        } catch (Exception e) {
            System.out.println("catch");
            return e.getMessage();
        } finally {
            System.out.println("finally");
            return "1";
        }
    }
    

    解析:
    try代码块中抛出异常后被catch,执行catch代码块,catch代码块中的return语句执行之前要先执行finally代码块,finally里有return语句,函数结束,不会再返回catch中的return语句,所以输出如下:

    catch
    finally
    1
    

    例子2:

    public static String method1() throws Exception {
        try {
            throw new Exception("myException");
        } finally {
            System.out.println("finally");
            return "1";
        }
    }
    

    解析:
    try代码块中抛出异常后没有被catch,抛出异常语句执行之前要先执行finally代码块,finally里有return语句,函数结束,不会再抛出异常,所以输出如下:

    finally
    1
    

    try-with-resource 结构

    新的try语法,类似于其他语言中的代码块结构,它会自动释放资源

    try (FileInputStream input = new FileInputStream("file.txt");
            BufferedInputStream bufferedInput = new BufferedInputStream(input)) {
        int data = bufferedInput.read();
        while (data != -1) {
            System.out.print((char) data);
            data = bufferedInput.read();
        }
    } 
    

    解析:

    • try () 中的资源将按照他们被创建顺序的逆序来关闭。首先BufferedInputStream 会被关闭,然后FileInputStream会被关闭
    • try () 中定义的资源可以是实现了AutoCloseable接口的类
    • try () 中定义的资源不能再更改.
    • try-with-resource 结构的语句也能够有catch和finally子句。catch和finally子句将会在try-with-resources子句中打开的资源被关闭之后得到调用

    相关文章

      网友评论

        本文标题:try-catch-finally的执行顺序以及 try-wit

        本文链接:https://www.haomeiwen.com/subject/fwzfsftx.html