try catch finally详解

先假设try catch finally整块叫A块
1、try块:A块程序的入口,有异常执行第2步,否则第3步
2、catch块:主要用于捕获try块中抛出的异常,并进行处理
3、finally块:A块的必须执行体,有些资料说finally是A块的最终执行体,这并不准确,假如try块中有个return,那finally执行完之后会返回到try块中
A块程序有个结束体,finally块就是在结束体之前强行调用运行。
??下面的方法会返回什么值
1private static String getStr(){
2 String str = "abc";
3 try{
4 return str;
5 }finally{
6 str += "def";
7 }
8}
程序运行到第4行,这就是A块结束体,此时跳到finally中执行,这时的str=“abcdef”,
但是执行第4行的时候,return str已经将str=“abc”压入函数栈中,所以此方法返回的还是“abc”


A块有一种可能的情况下不执行finally
关于A块的递归调用会产生这种现象 如:
private static void test() {  
   try {  
       System.out.println("a--");  
       test();  
   } catch (Throwable e) {  
       System.out.println("b--");  
       test();  
   } finally {  
       System.out.println("c--");  
       test();  
   }  
}  
这里A块的执行取决于机器了,假如内存足够大,程序会不断递归执行try块中的语句,一段时间不会执行finally,
内存不够时抛出异常,就会执行catch,遇到结束体又会执行finally,也许你在程序中随便加一段能编译通过的代码,运行又是另一种情况,这里就比较复杂了
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值