Java中,try,catch,finally 的代码以及return 执行顺序

首先,finally中的代码是一定会执行的,不管之前的代码是否抛出异常。

 

1、对于try中的return,在没有异常的情况下:

         先执行return之前的代码啊,包括return语句中的代码,但不会返回结果,然后跳到finally中执行。

         对于return的结果,如果是基本数据类型(int,string .......),会先存到栈中,finally中的语句不会对其产生影响;

                                       如果是非基本类型(list,map ...........), 会存到堆中,finally 中的语句会对其产生影响。

         等 finally 中的语句结束,return 结果(如果finally中没有return,当然,finally中基本上是不出现return的)。

2、如果发生异常,try中的return自然不会执行,跳到catch中:

          catch 中包含return,执行catch中的代码,返回的结果还是跟上面一样,要看结果的数据类型,判断finally 是否对返回的结果产生影响。

           catch中不包含return,那么最终的return在finally之外,finally自然会影响结果。

需要注意的是,在try或者catch中包含return时,finally 中并不是不改变结果,只是不会改变return返回的结果,看下面的例子:

 

对于第一种情况,写一个静态方法,main函数中做调用(ThreadTest 是随便起的类名):

public static void main(String[] args) {
    System.out.println("ert1-------- "+ThreadTest.ert1());
    System.out.println("qweqwe------ "+ThreadTest.qweqwe());
}

//基本类型
static int ert1() 
{
    int i = 1;
    try {
        i++;
        return ++i ;  //若果是i++,返回的是2	
    } 
    finally {
        ++i;
    }
}

//非基本类型(以list为例)
static List<String> qweqwe()
{
	List<String> list = new ArrayList<>();
	try {
			
		list.add("111");
		return list; 	
	} finally {
		list.add("222");
		System.out.println("finallyList........"+list);
	}
}

   执行结果:可以看到,虽然finally中把变量 i 改成 4,但返回的依然是 3,但是对于非基本类型的list  ,finally加入的"222"在try里的return中也被写入。

                      

 

对于产生异常的情,举例说明:

先把return放在catch块中看结果:

static int ert2() {
int i = 1;
    try {
	i++;
	//这里写一段有异常的代码:
	int num = 5/0;
	return ++i ;  //若果是i++,返回的是2	
    } 
    catch (Exception e) {
	i=123;
	e.printStackTrace();
	return i;
    }
    finally {
	++i;
	System.out.println("finally2......."+i);
    }
		
}

运行结果哦 :  finally 依然对返回的 int 类型的结果无影响(实际在内存中,i=124)

                                           

如果把函数 ert2() catch中的return 放到finally大括号后面,返回的  “i”  会是  124。   

 

 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值