首先我们看看最基本最简单的try-catch写法并对其进行分析。
public static void main(String[] args) {
System.out.println(show());
}
static int show(){
try {
System.out.println("try");
return 1;
} catch (Exception e) {
System.out.println("catch");
return 2;
}
}
其运行的结果为
try
1
可以看出,catch中的catch没有打印,说明程序没有进入到catch中。我们再来看下面的代码,并对其进行分析。
public static void main(String[] args) {
System.out.println(show());
}
static int show(){
try {
int i=1;
System.out.println(i/(i-1));
System.out.println("try");
return 1;
} catch (Exception e) {
System.out.println("catch");
return 2;
}
}
其运行的结果为
catch
2
我们可以看出只打印的catch而没有打印try。try中的try没有打印,说明程序在执行到1/0时已经出现异常,那么异常后面的程序就没有被执行,而是直接跳到catch中去执行catch中的代码了。
再看一下下面的代码
static int show(){
try {
System.out.println("try");
return 1;
} catch (Exception e) {
System.out.println("catch");
return 2;
} finally {
System.out.println("finally");
return 3;
}
}
打印的是
try
finally
3
由此我们可以看出,try中的代码执行完之后会去执行finally里面的代码。根据打印的数字是3而不是1可以分析出,返回语句执行的是finally里面的return而不是try里面的return。由此可见,如果finally里面如果有return,则返回语句会执行finally里面的return。
再看一下下面的代码
static int show(){
try {
System.out.println("try");
return 1;
} catch (Exception e) {
System.out.println("catch");
return 2;
} finally {
System.out.println("finally");
}
}
执行的结果是
try
finally
1
由此可以看见先打印的try,再打印的finally,最后打印的1。由此可以推断出,如果finally里面没有return语句,先执行的try里面的非return语句,然后再执行finally里面的语句,最后执行try里面的return语句。
我们再重新换一种当时对其进行研究。
static int show(){
int num = 1;
try {
System.out.println("try");
return num=num+3;
} catch (Exception e) {
System.out.println("catch");
return num=num+5;
} finally {
System.out.println("num="+num);
System.out.println("finally");
return num;
}
}
返回的结果是
try
num=4
finally
4
我们看见打印出的num=4,说明num=num+3这条语句已经执行了。那么我们可以理解成在没有出现异常的情况下,并且finally里面有return语句时,try中的语句执行完之后再去执行finally里面的语句,并且try里面的return如果是一个表达式,那么这个表达式也会在进入finally之前执行。
综上所有结果进行分析我们可以清楚的知道了,如果程序执行到try里面的代码,并且这个try-catch添加了finally语句块,那么就会有如下情况:
1、如果finally里面没有return语句,那么try或者catch里面的非return语句先执行,然后再执行finally里面的语句,最后执行try或者catch里面的return语句,try和catch里面没有return就不return了而已。
2、如果finally里面有return语句,不管try和catch里面有没有return语句,都是先执行try或者catch里面的语句,如果try或者catch里面的return后面跟的是表达式,那么这个表达式也会被执行。最后执行finally里面的语句,并返回finally里面的return。
以上是我对try-catch程序中finally的一些个人理解,如果有什么问题可以在评论区留言。也关注我的个人微信公众号了解更多的知识,里面有技术相关知识,也有一些其他个人分享,欢迎交流。