1

如果我运行以下代码:

try{
   return false;
} catch(Exception e){
       e.printStackTrace();
}
finally{
   return true;
}

为什么它返回true

4

5 回答 5

4

来自Java 语言规范第 14.20.2 节

  • 如果 try 块的执行由于任何其他原因 R 突然完成,则执行 finally 块,然后有一个选择:
    • 如果 finally 块正常完成,则 try 语句由于原因 R 突然完成。
    • 如果 finally 块由于原因 S 突然完成,则try 语句由于原因 S 突然完成(并且原因 R 被丢弃)

(我的斜体)。Areturn是一种“突然完成”,换句话说,return来自 的finally推翻来自 内部的try

于 2013-06-26T15:00:42.957 回答
1

因为无论 try catch 部分发生什么,finally 块都会按照您的要求执行,因此在这种情况下它会返回 true。只需删除 finally 语句,它应该返回 false。

于 2013-06-26T14:59:55.160 回答
1

它返回true是因为每当一个finally块突然完成时,无论是通过return-ing 或抛出异常,该完成都会取代任何先前的返回值或异常。(请参阅Java 语言规范,Java SE 7 版中的第14.20.2 节“执行try-finallytry-catch-finally。)

于 2013-06-26T14:58:46.020 回答
0

System.exit当 try 或 catch 块通过调用函数终止时,finally 块不会执行。同样,如果执行 try catch 的线程在执行 try 或 catch 块时死亡,那么 finally 块可能不会执行。

因此,即使您的 try 块返回 false ,您的 try catch finally 块也可能几乎总是返回 true 。

于 2014-09-25T05:44:48.140 回答
-1

因为如果遇到返回,finally 块总是会被执行。

于 2013-06-26T14:59:22.597 回答