try{}、catch{}、finally{} 中 return 的执行顺序

       今天在做一个多线程加读写锁的测试时,考虑效率问题,想及时 return 结果,但存在一个严肃的问题,那就是锁的开启和关闭问题。因为锁开启后,用完不及时关闭,会因堵塞而造成资源无法请求。因此,做了一个测试,尽量做到全面,哪怕有些显得有些脑残,测试嘛。

【示例1】try{}、catch{}、finally{} 代码块中,都有 return 时:

/**
 * @author qing
 * 
 *	Try……catch……finally中return的测试
 */
public class TryTest {

	/**
	 * 主要方法
	 */
	public static void main(String[] args) {
		// 调用 测试方法
		String result = get();
		// 打印 测试方法返回的结果
		System.out.println(result);
	}

	@SuppressWarnings({ "finally", "unused" })
	public static String get(){
		int value = 0;
		try {
			System.out.println("try……");
			
			//等式1/0 :分母为0 的明显错误          ——制造错误(用于抛异常)
			int result = 1 / value;
			
			return "111";
			
		} catch (Exception e) {
			System.out.println("catch……");
			return "444";
		} finally {
			System.out.println("finally……");
			return "333";
		}
		
//		return "222";
	}

运行结果:

结论:

(1)在通过编译器的检查后,如果 finally{} 中有 return,则以 finally{} 中的 return 为准,其他的都将失效,return 之前的代码都有效。

(2)第37行的 return “222” 于 catch{}、finally{} 中的任何一个 return 互斥。也就是说,在 catch{}、finally{} 中其中一个地方存在 return,编译器就能检查,已符合方法的返回要求。

(3)catch{} 和 finally{} 中,可同时存在 return,编译能通过。但程序以 finally{} 中的 return “333”为准,不会理睬 catch{} 中的 return “444”,catch{} 中 return 之前的代码仍然生效。

【示例2】catch{}、finally{} 中,都没有 return 时

         程序中 try{} 内部没有异常的情况下,若有 finally{},且 finally{} 中没有 return. 若在 try{} 中遇到 return,则先跳去执行 finally{} 中的代码,在回来执行 try{} 中 return.

情形一】:

public class TryTest {

	/**
	 * 主要方法
	 */
	public static void main(String[] args) {
		// 调用 测试方法
		String result = get();
		// 打印 测试方法返回的结果
		System.out.println(result);
	}

	public static String get(){
        int a = 0;
		try {
			System.out.println("try……");
			// System.out.println("err before");
            // int b = 1 / a;
            // System.out.println("err after");
			return "111";
		} catch (Exception e) {
			System.out.println("catch……");
		} finally {
			System.out.println("finally……");
		}
		
		return "222";
	}

}

执行一 结果为:

结论:

上面的程序,打印的是 "111",而不打印 "222". 由于未发生异常,执行 try{}…finally{} 之后,回去执行 try{} 中的 return 直接返回结果,完成方法调用。不会执行  try{}…Catch{}…finally{} 之外的 return.

情形二】:注释掉 第16行,打开 17~19行的注释:

执行二 结果为:

err before
catch……
finally……
222

结论:

由于发生异常,try{} 代码块中,出现异常之后的代码不再执行,直接跳到 catch{} 代码块执行,最后执行 finally{} 代码块的内容。由于 catch{} 和 finally{} 中都没有 return 这句代码。因此,try{}…catch{} … finally{} 之后的代码正常执行,并执行 return "222".

【实例3】只有 try{}…finally{} 而没有 catch{} 时:

    public static void main(String[] args) {
        test();
    }
    private static void test(){
        try {
            testTryExceptionFinally();
        }catch (Exception e){
            System.out.println("===== execute catch{} ======");
        }
    }
    private static void testTryExceptionFinally(){
        try{
            int a = 5;
            int b = 0;
            int c = a / b;
            System.out.println("try execute to c : " + c);
        }finally {
            System.out.println("===== execute finally{} =====");
        }
    }

执行结果:

===== execute finally{} =====
===== execute catch{} ======

结论:

(1)抛异常后,异常之后的代码将执行不到(不再执行 第16行 代码 )。
(2)在有 finally{} 代码块的程序中,无论是否发生异常,都会执行 finally{} 中的内容。

评论 14
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值