zoukankan      html  css  js  c++  java
  • try catch finally中return语句与非return语句的执行顺序问题

    finally语句一定是会被执行的,不管前边的try块catch块中有无return语句,并且如果finally中存在return语句,这个return语句将会是最后执行的return语句,即函数最后的返回值。try,catch中的return并不是让函数直接返回,而是return语句执行完毕,把返回结果放到函数栈中,转而执行finally块,所以,若是finally中含有return语句,那么函数栈中的返回值将被刷新。看以下几种情况:

    1:try有return,finally无

    public class TryFinallyReturnTest {
    static int test(){
    	int x=1;
    	try {
    		++x;
    		return x;
    	} catch (Exception e) {
    		// TODO: handle exception
    	}finally{
    		++x;
    		System.out.println("finally++x"+x);
    	}
    	return 0;
    }
    
    public static void main(String[] args) {
    	System.out.println(new TryFinallyReturnTest().test());
    }
    }
    

    输出结果:

    finally++x3
    2
    

    2:当 try 中抛出异常且 catch 中有 return 语句, finally 中没有 return 语句, java 先执行 catch 中非 return 语句,再执行 finally 语句,最后执行 catch 中 return 语句。

    public class Test {
    public int testTry(){
           FileInputStream fi=null;
          
           try{
               fi=new FileInputStream("");
              
           }catch(FileNotFoundException fnfe){
                System.out.println("this is FileNotFoundException");
                return 1;
           }catch(SecurityException se){
               System.out.println("this is SecurityException");
           }finally{
               System.out.println("this is finally");
           }
           return 0;
    }
     
    public static void main(String[] args) {
    Test t= new Test();
           System. out .println(t.testTry());
    }
    }
    Output :
    this is FileNotFoundException
    this is finally
    1
    

    3:当 try 中抛出异常且 catch 中有 return 语句, finally 中也有 return 语句, java 先执行 catch 中非 return 语句,再执行 finally 中非 return 语句,最后执行 finally 中 return 语句,函数返回值为 finally 中返回的值。

    public class Test {
    public int testTry(){
           FileInputStream fi=null;
          
           try{
               fi=new FileInputStream("");
              
           }catch(FileNotFoundException fnfe){
                System.out.println("this is FileNotFoundException");
                return 1;
           }catch(SecurityException se){
               System.out.println("this is SecurityException");
           }finally{
               System.out.println("this is finally");
                 return 3;
           }
           //return 0;
    }
     
    public static void main(String[] args) {
    Test t= new Test();
           System. out .println(t.testTry());
    }
    }
    Output :
    this is FileNotFoundException
    this is finally
    3
    

    4:另外,throw语句之后不能接任何语句,unreachable。

    部分摘自http://blog.csdn.net/leigt3/archive/2010/01/15/5193091.aspx

      

      

      

  • 相关阅读:
    ASP.NET Forms验证(自定义、角色提供程序)B
    SPSiteDataQuery使用说明
    moss2010 仿内容查询部件代码
    微软CRM系统二次开发步骤以及注意事项
    sap ABAP关于Data Reference的使用FIELDSYMBOLS
    selectoptions 模拟parmater
    ABAP "FOR ALL ENTRIES IN" 使用指南
    ABAP/4中参数的传递
    用接口CL_GUI_FRONTEND_SERVICES弹出选择文件对话框
    深入浅出理解索引结构
  • 原文地址:https://www.cnblogs.com/sungyouyu/p/3931545.html
Copyright © 2011-2022 走看看