2014-05-12 5 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 является Обновит ed в стеке до выполнения 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

Наконец оленья кожа выполнить перед возвращением, она выполняется после него, когда возвращаемое значение метода уже установлен.

Я не знаю, почему люди отметили это. Я утверждаю, что это простой правильный ответ. Если не принимать во внимание возможность исключений, эквивалентная реализация метода 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; 
} 

То есть, return в присутствии наконец блока не означает «выход сразу», но «установить отложенную возвращаемое значение , и выйдите, когда завершается блок finally ".

Смежные вопросы