含有return语句的try-catch-finally语句执行顺序

import java.io.*;

public class Mine{
    
    public int method0(){
       try{
           FileInputStream dis =new FileInputStream("Hello.txt"); //1,抛出异常
       }catch ( IOException ex) {
           System.out.println("No such file found");   //2.catch捕获异常,并执行
           return -1;                                  //4,return 返回
       }finally{
           System.out.println("Doing finally"); //3.finally一定会执行,在return之前。
       }
        return 0;
    }
    
    
    public int method1(int i){
        
        try {
            System.out.println("try块...");
            return i = i + 5;
            // 执行次序为,首先try块中return之前的部分,然后return之后的部分,
            //接着转入finally块继续执行,(如果finally块没有返回语句),执行完finally块,
            //再回到try块,执行return语句.
            //注意: 这种执行顺序只是保证了finally块一定会被执行, 
            //但finally块的语句对try块的return没有影响.
            //假如传入的参数i=0
            //则该方法返回值为5(而不是6!)
                       
        } finally {
            i++;
            System.out.println("in finally i = " + i);            
        }
        
    }
    
     public int method2(int i){
        
        try {
            System.out.println("try块...");
            return i = i + 5; 
            // 执行次序为,首先try块中return之前的部分,然后return之后的部分,
            //接着转入finally块继续执行,(由于finally块含有返回语句),
            //程序从finally块的return语句直接返回,不再执行try块的return
            //即:如果在finally语句中也有return,则try语句中的return值会被替换,
            //不过这种写法应该是要避免的!
            //假如传入的参数i=0
            //则该方法返回值为6(而不是5!)
        } finally {
            i++;
            System.out.println("in finally i = " + i);           
            return i ;                      
        }

    }
    
        
    public static void main(String argv[]){
        Mine m=new Mine();
        System.out.println( m.method0());
        
        int i = 0;        
        System.out.println(" ***********m.method1(i)********" );
        System.out.println("init i = "+i);
        System.out.println( m.method1(i) );
        System.out.println("after method1(i), i= "+i ); //java的值传递u
        
        System.out.println(" ***********m.method2(i)********" );
        System.out.println("init i = "+i);
        System.out.println( m.method2(i) );
        System.out.println("after method2(i), i= "+i ); //java的值传递u
                
    }
    
    
}

输出结果为:

No such file found
Doing finally
-1
***********m.method1(i)********
init i = 0
try块...
in finally i = 6
5
after method1(i), i= 0
***********m.method2(i)********
init i = 0
try块...
in finally i = 6
6
after method2(i), i= 0

结论:




执行次序为:




首先try块中return之前的部分,然后return之后的部分(假如关键字return后有运算的话),
       接着转入finally块继续执行,(如果finally块没有返回语句),执行完finally块,
       再回到try块,执行return语句.
注意: 这种执行顺序只是保证了finally块一定会被执行, 但finally块的执行结果对try块的return没有影响.
       此外, 如果finally里面有return,try中的return不会再执行; 
   如果try中有了异常,try中的return也不执行(似乎是很显然的,抛出异常的代码后面的都不会被执行). PS:异常实际上也是一种返回值


    程序在catch块中的执行情况,和try块一样.(先catch块return之前的部分,然后return之后的运算, 接着转入finally块继续执行,执行完finally块,再回到catch块,执行return语句)


from:http://hi.baidu.com/shenmike/blog/item/9f6f602cc9e81fed8a139992.html

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值