2015-06-02 3 views
5

Am запутался о том, как, наконец, ключевое слово на самом деле работает ..., наконец, не работает, как ожидалось

Перед попытка блока выполняется до завершения он возвращается туда, где метод был вызван. Но, прежде чем он вернется к методу вызова, код в блоке finally все еще выполняется. Итак, помните, что код в блоке finally будет выполняться, даже если есть оператор возврата где-то в блоке try.

когда я запускаю код, я получаю 5 вместо 10, как я ожидал

public class Main { 

    static int count = 0; 
    Long  x; 
    static Dog d  = new Dog(5); 

    public static void main(String[] args) throws Exception { 
     System.out.println(xDog(d).getId()); 
    } 

    public static Dog xDog(Dog d) { 

     try { 
      return d; 
     } catch (Exception e) { 
     } finally { 
      d = new Dog(10); 

     } 
     return d; 

    } 
} 

public class Dog { 

    private int id; 

    public Dog(int id) { 
     this.id = id; 
    } 

    public int getId() { 
     return id; 
    } 

} 
+1

http://stackoverflow.com/questions/65035/does-finally-always-execute-in-java –

+0

окончательный блок выполняется после заявления о возврате, поэтому у вас есть 5 не 10 –

ответ

9

Окончательно блок выполнен не до возвращения заявления, но до фактического возврата. Это означает, что выражение в выражении return оценивается до выполнения блока finally. В вашем случае, когда вы пишете return d, выражение d оценивается и сохраняется в регистре, тогда выполняется finally и возвращается значение из этого регистра. Невозможно изменить содержимое этого регистра.

+2

Если класс 'Собака' сеттер, и он выполнил бы 'd.setId (10);' в 'finally', он изменил бы значение Dog – Loki

0

Ваш код действительно работает, и оператор выполняется в блоке finally. Единственная причина, по которой вы не получаете 10, состоит в том, что вы не возвращаете значение, которое вы установили в блок finally. Код за пределами блока finally не запускается, поскольку он уже возвращает его в блок try. Чтобы заставить ваш код работать, вы просто переходите к этому методу xDog.

public static Dog xDog(Dog d) 
{ 
    try 
    { 
     return d; 
    } 
    catch (Exception e) 
    { } 
    finally 
    { 
     d = new Dog(10); 
     return d; 
    } 
} 

Надеюсь, это помогло вам.

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