这仍然没有任何意义,我仍然想知道是否有可能停止在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
块将仅部分执行。