如果finally
块在return statement present in side try block
之前执行,则为什么return list
不打印null
而是打印[DEV]。
public class Sub {
List list = new ArrayList();
public List check(){
try {
list.add("DEV");
return list;
}finally{
list = null;
System.out.println("Inside finally ["+list+"]");
}
}
public static void main(String[] args) {
Sub sup = new Sub();
System.out.println(sup.check());
System.out.println(sup.list);
}
}
O / P:
答案 0 :(得分:0)
list
引用的值对象在执行finally
语句之前在堆栈上更新。
这是怎么回事
return list;
块中的列表项try
更新堆栈上list
引用的对象。finally
块之后执行try
块,也会完成赋值list = null;
,但不会在堆栈上更新值。它不会更改返回的值。 System.out.println(sup.check());
打印DEV
,因为它是从try
块返回的值,即在堆栈上更新的值。 System.out.println(sup.list);
您直接引用list
变量,该变量在null
块中使用list = null;
设置为finally
,但不更新堆栈上的值。 答案 1 :(得分:-1)
最后不会在返回之前执行,它会在它之后执行,此时已经设置了方法的返回值。
我不知道为什么人们会这样做。我认为这是一个简单正确的答案。如果我们忽略了异常的可能性,check()
方法的等效实现是:
public List check() {
// try block part
list.add("DEV");
List ret_val = list;
// finally block part
list = null;
System.out.println("Inside finally ["+list+"]");
// and then actually exit the method
return ret_val;
}
也就是说,存在finally块时return
并不意味着“立即退出”,而是“设置挂起的返回值,并在完成finally块时退出”。