暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

你不知道的try catch fianlly执行顺序

Java精讲 2021-03-27
193

今天我们来聊一聊try catch finally
执行顺序,一般情况下很容易区分,在实际工作时也不会有非常复杂的情况,但有时候在面试的时候,为了考查面试者的基本功,会特意设计一些非常复杂的情况。该文章就给大家总结一下,它们的执行顺序,希望能帮助到大家。

请看如下例子:

public class TryCatchFinallyExecutionOrderTest {

@Test
public void testGetValue1() {
System.out.println(getValue1());
}

public int getValue1() {
int value = 3;
try {
value = 6;
return value;
} finally {
value = 9;
}
}
}

输出:6

try
执行到return
时,将这个要返回的结果存储在一个临时栈中,程序不会立即返回回去,而是会去执行finally
语句块,在执行value = 9
的时候,程序仅仅只是覆盖了value
的值,而不会更新这个临时栈中的值,执行完毕之后,就会通知主程序,finally{}
已经执行完毕,就会将临时栈的值取出返回。

接下来,我们把上面的例子改动一下:

public class TryCatchFinallyExecutionOrderTest {

@Test
public void testGetValue2() {
System.out.println(getValue2());
}

public int getValue2() {
int value = 3;
try {
value = 6;
return value;
} finally {
value = 9;
return value;
}
}
}


输出:9

程序执行finally{}
之前的过程和上一下代码一样,但是当它执行finally{}
时,value
依然会被覆盖,当执行到return value
时他将会直接返回value
,结束程序。

我再把例子再改一下:

public class TryCatchFinallyExecutionOrderTest {

@Test
public void testGetValue3() {
System.out.println(getValue3());
}

public int getValue3() {
int value = 3;
try {
value = 1 / 0;
return value;
} catch (Exception e) {
System.out.println("Error occurs");
return value;
} finally {
value = 9;
return value;
}
}
}

输出:9

这个程序发生了异常,当执行完catch
中的异常输出“发生了异常”之后,这个程序依然会继续执行fianlly
然后覆盖value
,最后再返回value
值。

再次修改例子:

public class TryCatchFinallyExecutionOrderTest {


@Test
public void testGetValue4() {
System.out.println(getValue4());
}

public int getValue4() {
int value = 3;
try {
value = 1 / 0;
return value;
} catch (Exception e) {
System.out.println("Error occurs");
return value;
} finally {
value = 9;
}
}
}


输出:3

catch
中的return
结果依然会被存储在一个临时栈中,当finally
执行完毕之后返回这个值。

通过上面的例子,我们可以得出结论:

  1. 不管有没有出现异常,finally
    块中代码都会执行;

  2. try
    catch
    中有return
    时,finally
    仍然会执行;

  3. finally
    是在return
    后面的表达式运算后执行的(此时并没有返回运算后的值,而是先把要返回的值保存起来,管finally中的代码怎么样,返回的值都不会改变,任然是之前保存的值),所以方法返回值是在finally
    执行前确定的;

  4. finally
    中最好不要包含return
    ,否则程序会提前退出,返回值不再是try
    catch
    块中的返回值。

--------------- END ---------------

每一篇文章都是小编精心为您准备的,写文不易,费时费脑;​『分享』+『点赞』+『在看』三连击是小编坚持的最大动力,拜谢!

文章转载自Java精讲,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论