今天我们来聊一聊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{}
已经执行完毕,可以请求返回了,就会将临时栈的值取出返回。
接下来,我们把上面的例子改动一下:
package com.nightsoul.imaged.mp.backend;
import org.junit.Test;
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
执行完毕之后返回这个值。
通过上面的例子,我们可以得出结论:
-
不管有没有出现异常,
finally
块中代码都会执行; - 当
try
和catch
中有return
时,finally
仍然会执行; finally
是在return
后面的表达式运算后执行的(此时并没有返回运算后的值,而是先把要返回的值保存起来,管finally中的代码怎么样,返回的值都不会改变,任然是之前保存的值),所以方法返回值是在finally
执行前确定的;finally
中最好不要包含return
,否则程序会提前退出,返回值不再是try
或catch
块中的返回值。
-------------------------------- END -------------------------------
及时获取更多精彩文章,请关注公众号《Java精讲》。