这仍然没有任何意义,我仍然想知道是否有可能停止在Java中执行finally块?如果是,怎么办?
例如说下面的代码:

public class Foo
{
    public static void main(String[] args)
    {
        try
        {
            return;
        }
        finally
        {
            System.out.println( "Yes, I executed successfully." );
        }
    }
}


我希望控制台上的输出不会像是,我执行成功。


  我得出的结论似乎是有可能的。所有答案都有
  接受可能性是不同的。所以,我不接受任何
  具体回答。请他们根据您的满意程度得出结论。谢谢大家
  谁张贴答案。

最佳答案

JLS §14.20.2


  通过首先执行带有try块的finally语句
  try块。然后有一个选择:
  
  
  如果try块的执行正常完成,则执行finally块,然后可以选择:
  
  如果finally块正常完成,则try语句正常完成。
  如果finally块由于原因S突然完成,则try语句由于原因S突然完成。
  
  如果try块的执行由于抛出V值而突然完成,则可以选择:
  
  如果V的运行时类型与catch语句的任何try子句的可捕获异常类的分配兼容,
  然后选择第一个(最左侧)这样的catch子句。值V
  被分配给所选catch子句的参数,并且
  该catch子句的块被执行。然后有一个选择:
  
  如果catch块正常完成,则执行finally块。然后有一个选择:
  
  如果finally块正常完成,则try语句正常完成。
  如果finally块由于某种原因突然完成,则try语句由于相同的原因突然完成。
  
  如果catch块由于R原因突然完成,则执行finally块。然后有一个选择:
  
  如果finally块正常完成,则try语句由于原因R突然完成。
  如果finally块由于原因S突然完成,则try语句由于原因S突然完成(并且原因R
  丢弃)。
  
  
  如果V的运行时类型与catch语句的任何try子句的可捕获异常类的分配不兼容,
  然后执行finally块。然后有一个选择:
  
  如果finally块正常完成,则try语句由于抛出值V而突然完成。
  如果finally块由于原因S突然完成,则try语句由于原因S突然完成(并且抛出了值
  V被丢弃并忘记了)。
  
  
  如果try块的执行由于任何其他原因R突然完成,则执行finally块,然后有一个
  选择:
  
  如果finally块正常完成,则try语句由于原因R突然完成。
  如果finally块由于原因S突然完成,则try语句由于原因S突然完成(并且原因R
  丢弃)。
  
  


简而言之,如果JVM没有退出(通过System.exit),则finally块将始终运行。

但是finally块可能会异常退出,例如抛出异常,在这种情况下,finally块将仅部分执行。

09-05 15:15