try catch finally详解

来源:互联网 发布:软件双开工具 编辑:程序博客网 时间:2024/05/16 14:11
先假设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
原创粉丝点击