• Java--finally


    finally 子句(clause)是不是总会执行???

    package com.volshell.test;
    
    public class Main {
        public static void main(String[] args) {
            change1(10);
        }
    
        private static void change1(int word) {
            System.out.println("测试结果:" + test(1));
        }
    
        private static int test(int i) {
            if (i == 1)
                return 0;
            System.out.println("将要进入try块");
            try {
                System.out.println("try block");
                return 3;
            } catch (Exception e) {
                // TODO: handle exception
            } finally {
                System.out.println("finally");
                i++;
                return i;
            }
        }
    }

    上面结果为 测试结果:0

    第一条:如果没有进入try中,是不会执行finally子句的。

     1 package com.volshell.test;
     2 
     3 public class Main {
     4     public static void main(String[] args) {
     5         change1(10);
     6     }
     7 
     8     private static void change1(int word) {
     9         System.out.println("测试结果:" + test(1));
    10     }
    11 
    12     private static int test(int i) {
    13 //        if (i == 1)
    14 //            return 0;
    15         System.out.println("将要进入try块");
    16         try {
    17             System.out.println("try block");
    18             System.exit(0);
    19             return 3;
    20         } catch (Exception e) {
    21             // TODO: handle exception
    22         } finally {
    23             System.out.println("finally");
    24             i++;
    25             return i;
    26         }
    27     }
    28 }

    测试结果:将要进入try块
          try block
    这次同样没有进入finally中。因为在try中调用了System.exit(0);

    第二条:当一个线程正在执行try语句块或者catch语句块的时候,突然被打断或者终止,那么相应的finally是不会被执行的。

    ***********************************************************************************************************

    The finally Block
    The finally block always executes when the try block exits. This ensures that the finally
    block is executed even if an unexpected exception occurs. But finally is useful for
    more than just exception handling — it allows the programmer to avoid having cleanup
    code accidentally bypassed by a return,continue, or break. Putting cleanup code in a
    finally block is always a good practice, even when no exceptions are anticipated.
    Note: If the JVM exits while the try or catch code is being executed, then the finally
    block may not execute. Likewise, if the thread executing the try or catch code is
    interrupted or killed, the finally block may not execute even though the application
    as a whole continues.

    ***************************************************************************************************************

    关于try,catch,finally的执行顺序的问题:

    ***************************************************************************************************************

    where either at least one catch clause, or the finally clause, must be present. 至少有一个catch或者finally子句。可以没有catch

    The body of the try statement is executed until either an exception is thrown or the body
    finishes successfully.   ---异常抛出或者程序正确执行都会执行try.

    If an exception is thrown, each catch clause is examined in turn,
    from first to last, to see whether the type of the exception object is assignable to
    the type declared in the catch. When an assignable catch clause is found, its block
    is executed with its identifier set to reference the exception object. No other catch
    clause will be executed. Any number of catch clauses, including zero, can be associated
    with a particular Try as long as each clause catches a different type of exception.
    If no appropriate catch is found, the exception percolates (渗透)out of the try statement
    into any outer try that might have a catch clause to handle it.--如果没有找到合适的捕获,交由外面的捕获来处理

    If a finally clause is present with a try, its code is executed after all other processing
    in the try is complete. This happens no matter how completion was achieved, whether
    normally, through an exception, or through a control flow statement such as return or
    break.只有处理完毕try中的语句(不包括异常语句,return语句,break语句)之后,才会执行finally全部子句(包括其中的return子句).

    ***************************************************************************************************************

    第三条:只有处理完毕try中的语句(不包括异常语句,return语句,break语句)之后,才会执行finally全部子句(包括其中的return子句等)。处理完finally之后再返回去处理try中的剩余子句。

  • 相关阅读:
    C#和Sql Server 2005中时间的最大值和最小值
    Windows Server 2008 R2 With SP1简体中文版 + 破解补丁
    Merge窗体的制作
    SqlServer2008R2卸载
    Highlighter(高亮控件的边框)
    如何删除window.old文件
    如何全屏WinForm的窗体
    验证时出错。HRESULT = '8000000A'
    ReflectionLabel(倒影控件)
    windows 2003和server 2008 取消对网站的安全检查/去除添加信任网站
  • 原文地址:https://www.cnblogs.com/plxx/p/4641597.html
Copyright © 2020-2023  润新知