终于没有按预期工作了

时间:2015-06-02 08:45:36

标签: java finally

我很困惑关于finally关键字实际上是如何运作的......

  

在try块运行完成之前,它返回到的任何地方   方法被调用。但是,在它返回到调用方法之前,   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;
    }

}

2 个答案:

答案 0 :(得分:9)

finally块在返回语句之前不是,而是在实际返回之前执行。这意味着在执行finally块之前评估return语句中的表达式。在您编写return d的情况下,d表达式被计算并存储到寄存器中,然后执行finally并返回该寄存器中的值。没有办法改变该登记册的内容。

答案 1 :(得分: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;
    }
}

我希望这对你有所帮助。