我很困惑关于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;
}
}
答案 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;
}
}
我希望这对你有所帮助。