发生这种情况是因为finallytry..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 子句是否首先被赋予控制权。