若可以走到 finally 里的 return ,则以该 return 为准
示例:
public class Main {
public static void main(String[] args) {
System.out.println(getNumber(false));
System.out.println(getNumber(true));
}
public static int getNumber(boolean flag) {
try {
if (flag) {
throw new RuntimeException("...");
}
return 1;
} catch (Exception ex) {
return 2;
} finally {
return 3;
}
}
}
结果:
3
3
若出了 finally 之后,还有 return,则以实际运行时走到的return为准
示例:
public class Main {
public static void main(String[] args) {
System.out.println(getNumber(false));
}
public static int getNumber(boolean flag) {
try {
if (flag) {
throw new RuntimeException("...");
}
} finally {
return 1;
}
return 2;
}
}
编译会报错:
$ javac Main.java
Main.java:18: 错误: 无法访问的语句
return 2;
^
1 个错误
可以通过加个判断语句绕过这个语法检查。见下面的示例:
public class Main {
public static void main(String[] args) {
System.out.println(getNumber(false));
System.out.println(getNumber(true));
}
public static int getNumber(boolean flag) {
try {
if (flag) {
throw new RuntimeException("...");
}
} finally {
if (flag) {
return 1;
}
}
return 2;
}
}
运行结果:
2
1