在try-catch-finally中, 当return遇到finally:
1.在try catch块里return的时候,finally也会被执行。
2.return 语句会把后面的值复制到一份用来返回,如果return的是基本类型的,finally里对变量的改动将不起效果,如果 return 的是引用类型的,改动将可以起效果。
3.finally里的return语句会把try catch块里的return语句效果给覆盖掉。
以上内容引自:http://blog.csdn.net/andymu077/article/details/6649812
下面用实例验证分析以上结论。
1、在try或catch块里return的时候,finally也会被执行。且执行顺序为:try或catch中return前的语句,finally中的语句,try或catch中的return。
public class Test {
public static void main(String[] args) {
String s = null;
System.out.println(test(s));
}
public static int test(String s){
try{
System.out.println("try");
return 1;
}catch (Exception e){
System.out.println("catch");
return 2;
}finally{
System.out.println("finally");
}
}
输出结果为:
try
finally
1
public class Test {
public static void main(String[] args) {
String s = null;
System.out.println(test(s));
}
public static int test(String s){
try{
int i = s.length();
System.out.println("try");
return 1;
}catch (Exception e){
System.out.println("catch");
return 2;
}finally{
System.out.println("finally");
}
}
}
输出结果为:
catch
finally
2
2、return 语句会把后面的值复制一份用来返回,如果return的是基本类型的,finally里对变量的改动将不起效果,如果return 的是引用类型的,改动将可以起效果。
(1)返回的是基本类型(包含String)时:
public class Test {
public static void main(String[] args) {
System.out.println(test());
}
public static int test(){
int a = 0;
try{
a = 1;
return a;
}catch (Exception e){
}finally{
a = 2;
}
return a;
}
}
输出结果为:1
(2)返回的是引用类型时:
public class Test {
public static void main(String[] args) {
System.out.println(test());
}
public static StringBuffer test(){
StringBuffer a = new StringBuffer();
try{
a = a.append("1");
return a;
}catch (Exception e){
}finally{
a = a.append("2");
}
return a;
}
}
输出结果为:12
3、finally里的return语句会把try catch块里的return语句效果给覆盖掉。此时执行finally中的return语句。
public class Test {
public static void main(String[] args) {
System.out.println(test());
}
public static String test(){
String a;
try{
a = "1";
return "a(try)="+a;
}catch (Exception e){
}finally{
a = "2";
return "a(finally)="+a;
}
}
}
输出结果为:a(finally)=2