美文网首页学习
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