美文网首页java异常
finally代码块一定会执行吗

finally代码块一定会执行吗

作者: 城市里永远的学习者 | 来源:发表于2018-11-14 10:00 被阅读0次

    答案是不一定,有如下几种情况:
    1.异常出现在try代码块之前,本质上是由于异常位置估计错误

    int  getResult()
    {
      int[] temp={1,2,3};
      System.out.Println(temp[4]);
      try{
          System.out.Println("try method");
      }
      catch(Exception e)
      {
           System.out.Println("catch method");
      }
      finally {
            System.out.Println("finally method");
      }
    }
    

    2.即使执行了try,也不一定执行finally,比如:System.exit(0);它表示退出当前Java虚拟机,一旦退出Java虚拟机,任何代码都不会再执行。
    3.即使没写System.exit(0) 也不一定会执行,来看try catch finally中有return的情况

    static  int temp()
        {
            int i=6;
            try{
                /* int  a=10/0; */
                System.out.println("try");
                return  0;
            }
            catch (Exception ex)
            {
                System.out.println("catch");
                return  1;
            }
            finally {
                System.out.println("finally");
            }
        }
    

    在try或catch后,先打印了finally信息,然后通过return返回了数据,finally先执行后输出了结果
    4.在上边的例子中假如:

    static  int temp()
        {
            int i=6;
            try{
                /* int n=10/0; */
                System.out.println("try");
                return  0;
            }
            catch (Exception ex)
            {
                System.out.println("catch");
                return  1;
            }
            finally {
                System.out.println("finally");
                return  3;
            }
        }
    

    会打印 finally...return=3;
    但是下边这段代码:

    static main(){
      System.out.Println("main执行结果:"+temp());
    }
    static  int temp()
        {
            int i=1;
            try{
                /* int n=10/0; */
                System.out.println("try");
                return  i;
            }
            finally {
                i++;
                System.out.println("finally");
                System.out.println(i);
            }
        }
    

    结果为:try - finally - 2 main执行结果1 ,理论上讲 不是i不是2吗?为什么打印的main是1呢? 这就是保留返回值规则:先会把try或者catch代码块中的返回值保留,再来执行finally代码块中的语句,等到finally代码块执行完毕之后,在把之前保留的返回值给返回出去。但只适用于 return和throw语句,不适用于break和continue语句,因为它们根本就没有返回值。
    5.假如上边例子改成这样:

    static  int temp()
        {
            int i=1;
            try{
                /* int n=10/0; */
                System.out.println("try");
                return  i;
            }
            finally {
                ++i;
                System.out.println("finally");
                System.out.println(i);
                return  i;
            }
        }
    

    又会打印 try - finally - 2 - main返回值为2,这回就对了,因为在finally中返回了i=2。

    相关文章

      网友评论

        本文标题:finally代码块一定会执行吗

        本文链接:https://www.haomeiwen.com/subject/yrjdfqtx.html