try-catch-finally

面试的时候遇到try-catch-finally的执行顺序相关问题,发现忘了这个知识点。以此文记录下该知识点。

使用方法

对于try-catch-finally,我们可以使用3种组合方式:try-catch、try-finally和try-catch-finally。即catch和finally可以省略一个,但不能同时省略。

三者的执行顺序如下:

1
2
3
4
5
6
7
8
try{
//可能发生异常的代码。一旦发现异常,则立即跳到catch执行。否则不会执行catch里面的内容
}catch{
//除非try里面执行代码发生了异常,否则这里的代码不会执行
//因为异常了,有时直接在这里就return了
}finally{
//不管什么情况都会执行,包括try或 catch 里面用了return ,可以理解为只要执行了try或者catch,就一定会执行 finally
}

需要注意的是finally任何时候都要执行,除非进程被强制kill。

return的执行顺序

在try、catch和finally代码块中都能使用return语句,那么它们之间有怎样的顺序关系呢?

我们只需要记住一点:始终以最后一个return为准,即如果finally中有return语句,那么它就是最终的return。如果finally中没有,catch中有,那么发生异常后,catch中的return就是最终return。

还有一个问题需要注意:如果我们在try中return了一个变量,但是在finally中修改了这个变量,那么return的值会不会改变呢?比如下面这段代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
public static int fun(){
int i = 1;
try{
return i;
}catch (Exception e){
System.out.println("exception");
return i;
}finally {
System.out.println("finally: " + i);
++i;
}
}
public static void main(String[] args){
System.out.println(fun());
}

返回1还是2?答案是1。因为执行完try中return后,会把返回值1存储在栈中,finally中的修改,并不会影响返回值

不过许需要注意的是:如果返回的是一个Object引用,那么finally中的修改会影响返回对象的值。

打赏
  • 版权声明: 本博客所有文章除特别声明外,著作权归作者所有。转载请注明出处!
  • Copyrights © 2021-2022 Yin Peng
  • 引擎: Hexo   |  主题:修改自 Ayer
  • 访问人数: | 浏览次数:

请我喝杯咖啡吧~

支付宝
微信