如果我运行以下代码:
try{
return false;
} catch(Exception e){
e.printStackTrace();
}
finally{
return true;
}
为什么它返回true?
(我的斜体)。Areturn
是一种“突然完成”,换句话说,return
来自 的finally
推翻来自 内部的try
。
因为无论 try catch 部分发生什么,finally 块都会按照您的要求执行,因此在这种情况下它会返回 true。只需删除 finally 语句,它应该返回 false。
它返回true
是因为每当一个finally
块突然完成时,无论是通过return
-ing 或抛出异常,该完成都会取代任何先前的返回值或异常。(请参阅Java 语言规范,Java SE 7 版中的第14.20.2 节“执行try-finally
和try-catch-finally
”。)
System.exit
当 try 或 catch 块通过调用函数终止时,finally 块不会执行。同样,如果执行 try catch 的线程在执行 try 或 catch 块时死亡,那么 finally 块可能不会执行。
因此,即使您的 try 块返回 false ,您的 try catch finally 块也可能几乎总是返回 true 。
因为如果遇到返回,finally 块总是会被执行。