try-catch-finally中return,最终return
都知道try-catch-finally是异常捕获,其中try{执行的代码,若有异常进入catch},catch{出现异常执行},finally{无论正常异常都要执行}。
1)正常:
public static String m1() {
try {
System.out.println("try ...");
} catch (Exception e) {
System.out.println("catch ...");
} finally {
System.out.println("finally ...");
}
return "hello";
}
// 结果:
try ...
finally ...
hello
顺序进行,try执行,未有异常finally结束。
2)异常:
public static String m1() {
try {
int i = 10 / 0;
System.out.println("try ...");
} catch (Exception e) {
System.out.println("catch ...");
} finally {
System.out.println("finally ...");
}
return "hello";
}
// 结果:
catch ...
finally ...
hello
try执行,出现异常,进入catch,在进入finally结束。
以上都是我们的正常流程,不是今天的重点,接下来就是今天的重点在这三部分中执行return最终返回的是哪个?
1、情形一(try中return)
public static String m1() {
try {
// int i = 10 / 0;
// System.out.println("try ...");
return "try ...";
} catch (Exception e) {
System.out.println("catch ...");
} finally {
System.out.println("finally ...");
}
return "hello";
}
// 结果:
finally ...
return = try ...
看结果,在返回结果之前先进入finally,该种情况下要是我们想要返回值是可以得到我们想要的结果。
2、情形二(catch中return)
public static String m1() {
try {
int i = 10 / 0;
System.out.println("try ...");
// return "try ...";
} catch (Exception e) {
System.out.println("catch ...");
return "catch ...";
} finally {
System.out.println("finally ...");
}
return "hello";
}
// 结果:
catch ...
finally ...
return = catch ...
程序执行完,return要在执行完finally之后返回,和情形一类似。
3、情形三(finally中return)
public static String m1() {
try {
int i = 10 / 0;
System.out.println("try ...");
// return "try ...";
} catch (Exception e) {
System.out.println("catch ...");
// return "catch ...";
} finally {
System.out.println("finally ...");
return "finally ...";
}
// return "hello";
}
//结果:
catch ...
finally ...
return = finally ...
情形一,二,三都是只有一个renturn的,在return之前都要保证finally被执行完。
4、情形四(try或者catch中有并且finally也有)
根据前三种情况,分析一下最终的return会是哪一个?
public static String m1() {
try {
// int i = 10 / 0;
System.out.println("try ...");
return "try ...";
} catch (Exception e) {
System.out.println("catch ...");
// return "catch ...";
} finally {
System.out.println("finally ...");
return "finally ...";
}
// return "hello";
}
// 结果:
try ...
finally ...
return = finally ...
可以看到输出的是finally中的,按理来说应该是顺着执行下来,先来try or catch中的才是。
结论:顺序执行,到达try or catch 中的return,先挂起,等待finally执行完毕在return,但是finally中return时,执行完finally就被提前return了,导致无法再去return try or catch中的。