谈谈对try-catch中finally的一些理解

首先我们看看最基本最简单的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的一些个人理解,如果有什么问题可以在评论区留言。也关注我的个人微信公众号了解更多的知识,里面有技术相关知识,也有一些其他个人分享,欢迎交流。

猜你喜欢

转载自blog.csdn.net/sqhren626232/article/details/84864103
今日推荐