美文网首页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