执行顺序是先 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子句中打开的资源被关闭之后得到调用
网友评论