Java 在 finally 里返回会忽略执行中的任意异常。如代码如下:
public class TestFinally {
public static String callFunction(int i) {
String ret = "success";
boolean success = false;
try {
if (i % 2 == 0) {
throw new RuntimeException();
}
success = true;
} finally {
if (!success) {
ret = "not success";
}
return ret;
}
}
public static void main(String[] args) {
System.out.println(callFunction(0));
System.out.println(callFunction(1));
}
}
输出结果如下:
not success
success
当参数为 0 时,会抛出异常,然后进入finally 代码块, finally 中,有 return,会返回 “not success”,不会继续向上层抛出异常。
如果我们的上层代码依赖异常,则会返回错误的结果。
向上抛出异常示例
我们把return 放到 finally 代码块之后,代码如下:
import xxx;
public class TestFinally {
public static String callFunction(int i) {
String ret = "success";
boolean success = false;
try {
if (i % 2 == 0) {
throw new RuntimeException();
}
success = true;
} finally {
if (!success) {
ret = "not success";
}
}
return ret;
}
public static void main(String[] args) {
System.out.println(callFunction(0));
System.out.println(callFunction(1));
}
}
执行结果如下:
Exception in thread "main" java.lang.RuntimeException
at com.baidu.java.finallyTest.TestFinally.callFunction(TestFinally.java:10)
at com.baidu.java.finallyTest.TestFinally.main(TestFinally.java:22)
当参数为 0 时,会抛出异常,然后执行 finally,在 finally 里没有 return。执行完 finally 代码块后,继续向上层抛出异常。
7881

被折叠的 条评论
为什么被折叠?



