最后如何阻止工作

时间:2014-05-12 11:33:57

标签: java

如果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:

  • 里面终于[null]
  • [DEV]

2 个答案:

答案 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块时退出”。