在try的括号里面有return一个值,那在哪里执行finally里的代码?
首先,不论如何,肯定的是finally是在return之前执行的。具体有:
情况一:return的是基本数据类型,这个时候如果finally中没有return语句,则以try中的为准,若finally中有return,则会覆盖try中的return。
对于try中的return语句,return执行到中间的时候发现finally,则先不返回,而是把值先暂存到本地栈,等finally运行之后再返回,如果finally里也有返回语句,那么以finally为主,否则才把本地栈里的返回值真的返回。
public static void main(String[] args) {
int a = Test.getNubmer();
System.out.println(a);
}
public static int getNubmer(){
int b;
try {
b = 5;
return b;
} finally {
b = 8;
// return b;
}
}
运行结果为:5
public static void main(String[] args) {
int a = Test.getNubmer();
System.out.println(a);
}
public static int getNubmer(){
int b;
try {
b = 5;
return b;
} finally {
b = 8;
return b;
}
}
运行结果为:8
情况二:return的是引用类型,这个时候不论finally中有没有return语句,他都会覆盖try中的内容。比如:
public static void main(String[] args) {
System.out.println(Test.getUser().getName());
}
public static User getUser(){
User user = new User();
try {
user.setName("张三");
return user;
} finally {
user.setName("李四");
System.out.println("我被执行了");
// return user;
}
不论是否有注释掉的return,执行结果都是:李四
另外:
public static void main(String[] args) {
System.out.println(getUser());
}
public static String getUser(){
String s = null;
try {
s="222";
System.out.println(s);
return s;
} finally {
s="111";
System.out.println(s);
return s;
}
}
执行结果:
222
111
111
public static void main(String[] args) {
System.out.println(getUser());
}
public static String getUser(){
String s = null;
try {
s="222";
System.out.println(s);
return s;
} finally {
s="111";
System.out.println(s);
// return s;
}
执行结果为:
222
111
222
另外:
public class TestDemo
{
public static String output = "";
public static void foo(int i)
{
try
{
if (i == 1)
{
throw new Exception();
}
}
catch (Exception e)
{
output += "2";
return ;
} finally
{
output += "3";
}
output += "4";
}
public static void main(String[] args)
{
foo(0);
foo(1);
System.out.println(output);
}
}
运行结果是:3423
解析:本题与上面不同的主要原因,还在于本题中的output为static。