try与finally块中的return问题

这个问题是去紫光面试的时候问到的一个问题:

情况1:try{} catch(){} finally{} return;

 

public class Test {
	public static void main(String[] args) {
		System.out.print(tt());
	}

	public static int tt() {
		int b = 23;
		try {
			System.out.println("yes");
			b += 88;
		} catch (Exception e) {
			System.out.println("error :" + e);
		} finally {
			if (b > 25) {
				System.out.println("b>25 :" + b);
			}
			System.out.println("finally");
		}
		return 101; //---4 
	}
}

 


显然程序按顺序执行,最后return 101退出
结果:

yes
b>25 :111
finally
101


情况2:try{ return; } catch(){} finally{} return;

 

public class Test{   
    public static void main(String[] args){ 
         System.out.print(tt());    
    }    
    public static int tt(){    
         int b = 23;    
         try{    
             System.out.println("yes"); 
             b += 88; 
             return b;            //---1 
         }catch(Exception e){    
             System.out.println("error :" + e); 
         }finally{    
              if(b>25){    
                  System.out.println("b>25 :"+b);    
              }    
              System.out.println("finally");    
         } 
         return 101;             //---4 
    } 
} 

 

程序执行try块中return之前(包括return语句中的表达式运算)代码;再执行finally块,最后执行try中return;
finally块之后的语句,这里的4处return,因为程序在1处已经return所以不再执行。
结果:

yes
b>25 :111
finally
111


情况3:try{ } catch(){ return;} finally{} return;

public class Test {
	public static void main(String[] args) {
		System.out.print(tt());
	}
	public static int tt() {
		int b = 23;
		try {
			System.out.println("yes");
			b += 88;
		} catch (Exception e) {
			System.out.println("error :" + e);
			return b; //---2 
		} finally {
			if (b > 25) {
				System.out.println("b>25 :" + b);
			}
			System.out.println("finally");
		}
		return 101; //---4 
	}
} 

 

 

程序先执行try,如果遇到异常执行catch块,
    有异常:则执行catch中return之前(包括return语句中的表达式运算)代码,再执行finally语句中全部代码,最后执行
catch块中return. finally之后也就是4处的代码不再执行。
    无异常:执行完try再finally再return.
结果:本次为无异常结果(当然本示例没有设计异常)

yes
b>25 :111
finally
101

 


情况4:try{ return; } catch(){} finally{return;}

 

public class Test {
	public static void main(String[] args) {
		System.out.print(tt());
	}

	public static int tt() {
		int b = 23;
		try {
			System.out.println("yes");
			b += 88;
			return b; //---1 
		} catch (Exception e) {
			System.out.println("error :" + e);
		} finally {
			if (b > 25) {
				System.out.println("b>25 :" + b);
			}
			System.out.println("finally");
			return 100; //---3 
		}
	}
} 

程序执行try块中return之前(包括return语句中的表达式运算)代码;再执行finally块,因为finally块中有return所以提前退出。
结果:

yes
b>25 :111
finally
100

 

情况5:try{} catch(){return;} finally{return;}

 

public class Test {
	public static void main(String[] args) {
		System.out.print(tt());
	}

	public static int tt() {
		int b = 23;
		try {
			System.out.println("yes");
			b += 88;
		} catch (Exception e) {
			System.out.println("error :" + e);
			return b; //---2 
		} finally {
			if (b > 25) {
				System.out.println("b>25 :" + b);
			}
			System.out.println("finally");
			return 100; //---3 
		}
	}
} 

 程序执行catch块中return之前(包括return语句中的表达式运算)代码;再执行finally块,因为finally块中有return所以提前退出
结果:

yes
b>25 :111
finally
100

 

情况6:try{ return;} catch(){return;} finally{return;}

 

public class Test{   
    public static void main(String[] args){ 
         System.out.print(tt());    
    }    
    public static int tt(){    
         int b = 23;    
         try{    
             System.out.println("yes"); 
             b += 88; 
             return b;            //---1 
         }catch(Exception e){    
             System.out.println("error :" + e); 
             return b;            //---2 
         }finally{    
              if(b>25){    
                  System.out.println("b>25 :"+b);    
              }    
              System.out.println("finally");    
              return 100;        //---3 
         } 
    } 
} 

 程序执行try块中return之前(包括return语句中的表达式运算)代码;
   有异常:执行catch块中return之前(包括return语句中的表达式运算)代码;则再执行finally块,因为finally块中有return所以提前退出
   无异常:则再执行finally块,因为finally块中有return所以提前退出
无异常结果:

yes
b>25 :111
finally
100

以下情况
情况1:try{} catch(){} finally{} return;
情况2:try{ return; } catch(){} finally{} return;
情况3:try{} catch(){ return;} finally{} return;
情况4:try{ return; } catch(){} finally{return;}
情况5:try{} catch(){return;} finally{return;}
情况6:try{ return;} catch(){return;} finally{return;}

以上几种情况说明:
一、如果try catch finally块均无return则执行最后finally外的return;如果try catch finally中任何一个有return则最后finally外的return不再执行;
二、只要finally块中有return则try或catch中的return不再执行

以下几种情况在finally块的后面是不能出现return的。
情况:try{} catch(){} finally{ return;} return;
情况:try{ return; } catch(){} finally{return;} return;
情况:try{} catch(){return;} finally{return;} return;
情况:try{ return; } catch(){return;} finally{} return;
情况:try{ return; } catch(){return;} finally{return;} return;

上面几种情况因为finally块中已有return,而且是必须执行的,所以finally外的return必定不能执行,所以编译器提示错误。特殊的 try{ return; } catch(){return;} finally{} return;是因为try和catch中都有return所以必定会执行其中一个,所以finally外的return不能执行,所以编译器提示错误。

还有一种情况:


最终结论:任何调用try 或者catch中的return语句之前,都会先执行finally语句,如果finally存在的话。如果finally中有return语句,那么程序就return了,所以finally中的return是一定会被return的,编译器把finally中的return实现为一个warning。

 

本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/samsunge808/archive/2009/03/02/3951159.aspx

你可能感兴趣的:(.net,面试,Blog)