Java关键字finally

参考文章:关于Java中finally语句块的深度辨析 

仅考虑程序正常执行的情况下,不考虑System.exit(0)等情况。不过关于“finally 语句块一定会执行吗?”这个问题确实会有一定的说法。

1,无控制转移语句,在return之前执行

(1)
try {
    System.out.println("try...");
    return;
} catch (Exception e) {
    System.out.println("catch...");  
} finally {
    System.out.println("finally...");
}
output:会在try代码块return之前执行
try...
finally...
(2)
try {
    System.out.println("try...");
    throw new Exception(" ");
} catch (Exception e) {
    System.out.println("catch...");
    return;
} finally {
    System.out.println("finally...");
}
output:会在catch代码块return之前执行
try...
catch...
finally...

 2,finally中有return 

(1)
public class Demo{
    public static void main(String[] args) {
        System.out.println("result = " + test(10));
    }
    
    public static int test(int i) {
        try {
            System.out.println("try...");
            return i-1;
        } catch (Exception e) {
            System.out.println("catch...");
            return i-2;
        } finally {
            System.out.println("finally...");
            return i-4;
        }
    }
}
output:return的是6,finally中的结果
try...
finally...
result = 6
(2)
public class Demo{
    public static void main(String[] args) {
        System.out.println("result = " + test(10));
    }
    
    public static int test(int i) {
        try {
            System.out.println("try...");
            throw new Exception();
        } catch (Exception e) {
            System.out.println("catch...");
            return i-2;
        } finally {
            System.out.println("finally...");
            return i-4;
        }
    }
}
output:return的是6,finally中的结果
try...
catch...
finally...
result = 6
(3)finally中有无return,但是有运算
import java.util.HashMap;
import java.util.Map;

public class Demo{
    public static void main(String[] args) {
        System.out.println("result = " + test(10));
    }
    
    public static int test(int i) {
        Map<String, Object> map = new HashMap<String, Object>();
        map.put("Demo", "Demo");        
        try {
            System.out.println("try...");
            return i-1;
        } catch (Exception e) {
            System.out.println("catch...");
            return i-2;
        } finally {
            System.out.println("finally...");
            i = i-4;
        }
    }
}
output:return的是9,而不是10-4-1=5
try...
finally...
result = 9
(4)在finally中return
import java.util.HashMap;
import java.util.Map;

public class Demo{
    public static void main(String[] args) {
        System.out.println("result = " + test(10));
    }
    
    public static int test(int i) {
        try {
            System.out.println("try...");
            return i-1;
        } catch (Exception e) {
            System.out.println("catch...");
            return i-2;
        } finally {
            System.out.println("finally...");
            return i-4;
        }
    }
}
output:与(1)(2)类似,直接return了
try...
finally...
result = 6
(5)在代码块外面return
public class Demo{
    public static void main(String[] args) {
        System.out.println("result = " + test(10));
    }
    
    public static int test(int i) {
        try {
            System.out.println("try...");
            i--;
        } catch (Exception e) {
            System.out.println("catch...");
            return i-2;
        } finally {
            System.out.println("finally...");
            i = i - 4;
        }
        return i;
    }
}
output:
try...
finally...
result = 5

 

posted @ 2016-01-21 14:40  lemon-now  阅读(601)  评论(0)    收藏  举报