发生这种情况是因为finally
try..catch..finally 的块在代码try..catch
完成后运行
您被分配了在finally
您返回之前和之前的值try
finally 中的代码总是会执行,但是你已经返回了try
.
try {
++a;
return a;
} finally {
a = 10;
}
现在的a
值是10
,之后的return
。虽然不是一个好习惯,但只是为了演示。
int a= 0;
try {
++a;
return a;
} finally {
a = 10;
return a;
}
现在return
是10
。
编辑:
您的疑问:为什么无法实现的错误不会出现?
在try-catch-finally
块是不同的。在同一个块中做同样的事情,看看。
try {
++a;
return a;
a=100; //compiler error.
} finally {
a = 10;
}
编辑2
来自try-catch-finally 的 java 语言规范:
try 语句执行一个块。如果抛出一个值并且 try 语句有一个或多个可以捕获它的 catch 子句,则控制将转移到第一个这样的 catch 子句。如果 try 语句有 finally 子句,则执行另一个代码块,不管 try 块是正常完成还是突然完成,也不管 catch 子句是否首先被赋予控制权。