java异常处理之try_catch_finally

java异常处理之try_catch_finally

看下面的一个列子:

复制代码
public class TestException {  
    int goabl=1;
    public TestException() {  
    }  

    int testEx() throws Exception {  
        int ret = 1;  
        try {  
            ret++; 
            return ret;
        } catch (Exception e) {  
           ret++;
           return ret;
        } finally {  
           ret=0;         
        }  
    }  

    int testEx1() throws Exception {  
         int ret = 1;  
         try {  
             ret++; 
             int t=ret/(ret-2);//制造一个exception
             return ret;
         } catch (Exception e) {  
            ret++;
            return ret;
         } finally {  
            ret=0;         
         }  
    }  

    int testEx2() throws Exception {  
        int ret = 1;  
        try {  
            ret++; 
            int t=ret/(ret-2);//制造一个exception
            return ret;
        } catch (Exception e) {  
           ret++;
           return ret;
        } finally {  
           ret=0;
           return ret;
        }  
    }  
    int testEx3() throws Exception {  
        int ret = 1;  
        try {  
            ret++; 
            return ret;
        } catch (Exception e) {  
           ret++;
           return ret;
        } finally {  
           ret=0;
           return ret;
        }  
    }  
    int testEx4() throws Exception {  
        try {  
            goabl++; 
            return goabl;
        } catch (Exception e) {  
            goabl++;
           return goabl;
        } finally {  
            goabl=0;

        }  
    }  

    public static void main(String[] args) {  
        TestException testException1 = new TestException();  
        try {  
            System.out.println(testException1.testEx());
            System.out.println(testException1.testEx1());
            System.out.println(testException1.testEx2());
            System.out.println(testException1.testEx3());
            System.out.println(testException1.testEx4());
        } catch (Exception e) {  
            e.printStackTrace();  
        }  
    }  
}  
复制代码

程序的运行结果是:

2
3
0
0
2

如果你的答案是正确的且知道是为什么,那么下面的内容相信你也不用看了。
首先这里我就不细说java的异常处理机制,想了解的同学可以去看看java异常处理深入研究。
我们首先对try_catch_finally的执行顺序进行说明。
首先我可以很明确的告诉大家try_catch_finally的执行顺序其实很简单,首先是执行try中的 语句如果有异常就直接进入catch,最后finally一定会执行。
这样可能有人会问那为什么第一个的输出不是0呢?别急我们来一个一个说明。

testEx

try语句中没有任何异常所以catch不会执行。ret进行了一次++操作,这时程序进行了返回,在内存中会生成一个临时变量,来保存ret,也就是说ret的值赋给了一个临时变量所以,ret在finally中赋值为零并不会改变返回的值所以输出为2;

testEx1

这次我们人为的在try的语句中制造了exception这样程序会进入到catch中,所以ret被++两次,同样finally中的语句不能对返回值产生影响,所以输出为3;

testEx2

相对于testEx1我们在finally语句中加入了return语句,说以函数的返回值变成了0,这样说名我能函数的返回值实在finally执行结束后才确定的。

testEx3

同testEx2一样由于finally中加入了return语句,返回值为0;

testEx4

在这个函数中我们把操作的对象改为了全局变量,结合最后一个输出我们可以知道函数的返回结果的确是被一个临时变量接收了,所以函数返回的结果是2,但是goabl已经变为0了。

try()里面有一个return语句,那么后面的finally{}里面的code会不会被执行,什么时候执行,是在return前还是return后?

自己写了个代码测试了一下:

复制代码
public static void main(String[] args) {  
    int i=getInt();  
    System.out.println(i);  
}  
  
private static int getInt() {  
    // TODO Auto-generated method stub  
    try {  
        return 0;  
    } catch (Exception e) {  
        // TODO Auto-generated catch block  
        e.printStackTrace();  
    }finally{  
        return 1;  
    }  
}
复制代码

输出的结果是1

 

posted on   luzhouxiaoshuai  阅读(184)  评论(0编辑  收藏  举报

编辑推荐:
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
阅读排行:
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!

导航

< 2025年3月 >
23 24 25 26 27 28 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31 1 2 3 4 5

统计

点击右上角即可分享
微信分享提示