Java try-catch-finally块

Java try-catch-finally块,java,try-catch,Java,Try Catch,如果我运行以下代码: try{ return false; } catch(Exception e){ e.printStackTrace(); } finally{ return true; } 为什么会返回true 它返回true,因为每当最终块通过返回或抛出异常而突然完成时,该完成将取代以前的任何返回值或异常。(请参阅。)它返回true,因为每当最后块通过返回或抛出异常突然完成时,该完成将取代任何以前的返回值或异常。(请参阅。)因为如果遇到返回,将始终执行fin

如果我运行以下代码:

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

为什么会返回true

它返回
true
,因为每当
最终
块通过
返回或抛出异常而突然完成时,该完成将取代以前的任何返回值或异常。(请参阅。)

它返回
true
,因为每当
最后
块通过
返回或抛出异常突然完成时,该完成将取代任何以前的返回值或异常。(请参阅。)

因为如果遇到返回,将始终执行finally块。

因为如果遇到返回,将始终执行finally块。

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

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

  • 如果try块的执行由于任何其他原因突然完成,则执行finally块,然后有一个选择:
    • 如果finally块正常完成,那么try语句由于原因R而突然完成
    • 如果finally块由于原因S而突然完成,那么try语句由于原因S而突然完成(并且原因R被丢弃)
(我的斜体)。
返回
是一种“突然完成”,换句话说,来自
返回
最终
推翻了来自
try
内部的返回

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

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

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


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

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


因此,即使try-catch-finally块返回false,try-catch-finally块也几乎总是返回true。

这可能是错误的重复。永远,永远,用return/throw/break/continue退出finally块。永远不要让异常从
finally
块中传播出去。可能的重复是不好的。永远,永远,用return/throw/break/continue退出finally块。永远不要让异常传播到
finally
块之外。-“如果finally块因原因S而突然完成,那么try语句因原因S而突然完成。”@RussellZahniser:是的,您在我添加链接时发表了评论。(但请注意,这个特定的句子实际上并不适用于本例。本例中有一个单独的、类似的句子。)-“如果finally块由于原因s而突然完成,那么try语句由于原因s而突然完成。”@RussellZahniser:Yup,您在我添加链接时发表了评论。(但请注意,具体的句子实际上并不适用于本案。本案有一个单独的类似句子。)