• 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
  • 相关阅读:
    mysql基础
    协程
    锁与队列
    线程练习
    线程
    并发编程
    进程
    操作系统发展史
    第六周----例行报告
    附加题找bug
  • 原文地址:https://www.cnblogs.com/lemon-now/p/5148131.html
Copyright © 2020-2023  润新知