今天在做一个多线程加读写锁的测试时,考虑效率问题,想及时 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{} 中的内容。