`

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

分享到:
评论

相关推荐

    try~catch~finally中关于return的问题

    在Java的异常机制中,如果finally中含有return语句,则try和catch中的return语句将会被JVM忽视

    Java中finally块执行与return关系深度剖析

    Java finally语句到底是在return之前还是之后执行?Java finally执行深度剖析,具体看这篇博文:http://blog.csdn.net/lanxuezaipiao/article/details/16922895,这是里面相关的源码,欢迎大家下载使用。

    try、catch、finally、return 执行顺序.doc

    try、catch、finally、return 执行顺序超详细讲解,包看包会。

    Jungle68#-#[Java] try catch finally,try里有return,finally还执行么?1

    Condition 3: try中有异常,try-catch-finally里都没有return ,finally 之后有个returntry中有异常以后,根据

    try-finally-return-in-finally.rar_return

    Shouldn t crash on regexps with many nested parentheses.

    try-catch-finally执行顺序验证

    try-catch-finally执行顺序验证(左边是....(2)如果finally中无return则执行return var,finally块中的操作不会影响var的值(如果var的值是对象的内存地址,则finally块的操作可以改变该对象的属性值)。 验证 1.基本类型

    关于Java中的try-catch-finally语句和return

     第二:finally里面不建议放return语句,根据需要,return语句可以放在try和catch里面和函数的后。可行的做法有四:  1、return语句只在函数后出现一次。  2、return语句仅在try和catch里面都出现。  3、...

    try-catch-finally-return-in-finally.rar_return

    The production IfStatement : if ( Expression ) Statement else Statement is evaluated as follows:.

    谈谈Java中try-catch-finally中的return语句

    我们知道return语句用在某一个方法中,一是用于返回函数的执行结果,二是用于返回值为void类型的函数中,仅仅是一个return语句(return ;),此时用于结束方法的执行,也即此return后的语句将不会被执行,当然,这种...

    浅谈Java中return和finally的问题

    在Java中当try、finally语句中包含return语句时,执行情况到底是怎样的,finally中的代码是否执行,大家众说纷纭,有的说会执行,有的说不会执行,到底哪种说法正确,下面我们来详细讨论下

    关于Java中try finally return语句的执行顺序浅析

    主要介绍了关于Java中try finally return语句的执行顺序浅析,需要的朋友可以参考下

    java大厂面经、直击BAT

    finally 一定会被执行,如果 finally 里有 return 语句,则覆盖 try/catch 里的 return , 比较爱考的是 finally 里没有 return 语句,这时虽然 finally 里对 return 的值进行了修改,但 return 的值并不改变这种...

    try catch finally的执行顺序深入分析

    首先执行try,如果有异常执行catch,无论如何都会执行finally,当有return以后,函数就会把这个数据存储在某个位置,然后告诉主函数,我不执行了,接下来你执行吧,所以函数就会推出

    trycatchfinaly

    3. 但是如果有 finally块的话,那么,finally 几乎是必定会执行的,但是这里有一个先后顺序的问题,应该是 finally 块和 打印异常堆栈将会在另外一个线程之中执行,所以 打印的顺序就很有意思了。 4. 如果在try或者...

    try finally 妙用,防止内存泄漏

    [Ctrl+A 全选 注:如需引入外部Js需刷新才能执行]这种写法在IE中100%内存泄漏 使用try finally很容易解决些问题 代码如下:function createButton(){ var obj = document.createElement(“button”); obj...

    对python中的try、except、finally 执行顺序详解

    print('to return in try') return 'try' except Exception: print('process except') print('to return in except') return 'except' finally: print('to return in finally') return 'finally' test1...

    josonle#Coding-Now#finally语句如何执行1

    - 无论try是否发生异常,finally语句都会执行- 如果try/catch中包含控制转移语句(return、continue、break),finally

    java面试题之try中含return语句时代码的执行顺序详解

    主要介绍了关于java中的一道面试题,这套题就是在try中含return语句时代码的执行顺序,这个问题看似简单,却暗藏杀机啊!文中通过一个个例子详细介绍了其中玄机,需要的朋友可以参考学习,下面来一起看看吧。

    C#中的yield关键字的使用方法介绍

    yield不能单独放在try-catch块中,如果try中有yield那么,这个try块后面不许跟着finally块;也不能出现在匿名方法中,所以,看起来yield似乎并不常用,但是也不是不用。我前面有一个关于迭代器的例子《C#中的迭代器...

    python异常处理之try finally不报错的原因

    因为有把python程序打包成exe的需求,所以,有了如下的代码 import time class LoopOver(Exception): def __init__(self, *args, **kwargs): ... return '总共用时:{}秒'.format(self.runtime) if __name__

Global site tag (gtag.js) - Google Analytics