2014-05-12 44 views
1

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

  • 内部终于[空]
  • [DEV]

回答

0

通过list所指的值的对象是updat在执行finally语句之前在栈上进行编辑。 这是怎么一回事呢

  • 列表项return list;try块更新由list堆栈引用的对象。
  • 另一方面,即使在try块后执行finally块,也会完成赋值list = null;,但该值未在堆栈上更新。它不会更改返回的值。
  • 陈述System.out.println(sup.check());打印DEV,因为它是从try块返回的值,即在堆栈上更新的值。
  • 这里System.out.println(sup.list);要直接参照其使用list = null;finally块不更新堆栈的值设置为nulllist变量。
-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块完成时退出“。