终于没有按预期工作
finally not working as expected
我对 finally 关键字的实际工作方式感到困惑...
Before the try block runs to completion it returns to wherever the
method was invoked. But, before it returns to the invoking method,
the code in the finally block is still executed. So, remember that
the code in the finally block willstill be executed even if there is
a return statement somewhere in the try block.
当我 运行 代码时,我得到了 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;
}
}
finally 块不是在 return 语句 之前 执行,而是在实际 return 之前 执行。这意味着在执行 finally 块之前评估 return
语句中的表达式。在您编写 return d
的情况下, d
表达式被计算并存储到寄存器中,然后执行 finally
并且该寄存器中的值被 returned 。无法更改该寄存器的内容。
您的代码确实可以正常工作并且语句在 finally 块中确实 运行。你没有得到 10 的唯一原因是因为你没有 return 你在 finally 块中设置的值。 finally 块外的代码没有得到 运行 因为它已经 return 在 try 块中了。要使您的代码正常工作,您只需将 xDog 方法更改为此。
public static Dog xDog(Dog d)
{
try
{
return d;
}
catch (Exception e)
{ }
finally
{
d = new Dog(10);
return d;
}
}
希望对你有所帮助。
我对 finally 关键字的实际工作方式感到困惑...
Before the try block runs to completion it returns to wherever the method was invoked. But, before it returns to the invoking method, the code in the finally block is still executed. So, remember that the code in the finally block willstill be executed even if there is a return statement somewhere in the try block.
当我 运行 代码时,我得到了 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;
}
}
finally 块不是在 return 语句 之前 执行,而是在实际 return 之前 执行。这意味着在执行 finally 块之前评估 return
语句中的表达式。在您编写 return d
的情况下, d
表达式被计算并存储到寄存器中,然后执行 finally
并且该寄存器中的值被 returned 。无法更改该寄存器的内容。
您的代码确实可以正常工作并且语句在 finally 块中确实 运行。你没有得到 10 的唯一原因是因为你没有 return 你在 finally 块中设置的值。 finally 块外的代码没有得到 运行 因为它已经 return 在 try 块中了。要使您的代码正常工作,您只需将 xDog 方法更改为此。
public static Dog xDog(Dog d)
{
try
{
return d;
}
catch (Exception e)
{ }
finally
{
d = new Dog(10);
return d;
}
}
希望对你有所帮助。