这还没有任何意义我仍然很想知道是否可以在java中停止执行 finally阻止?如果有,怎么样? 比如下面的代码:
public class Foo
{
public static void main(String[] args)
{
try
{
return;
}
finally
{
System.out.println( "Yes, I executed successfully." );
}
}
}
我希望控制台上的输出不会像是的,我执行成功。
嗯,这似乎有可能我得出结论。所有答案都有 不同的是接受它是可能的。所以,我不接受任何 具体回答。根据您的满意度,参考他们达成结论。谢谢大家 谁发布了答案。
答案 0 :(得分:2)
1. A infinite loop above it will stop its execution
2. System.exit() above it will stop it
答案 1 :(得分:1)
我认为this说得最好:
注意:如果在执行try或catch代码时JVM退出,则finally块可能无法执行。同样,如果执行try或catch代码的线程被中断或终止,则即使整个应用程序仍在继续,finally块也可能无法执行。
但是,try中的return语句不会阻止finally块的执行。也不会抛出异常。这种行为就是为什么finally块首先存在的原因。它可以让您可靠地清理资源。
答案 2 :(得分:1)
我还没有遇到过你真正需要的情况。但其典型的面试问题和答案是
System.exit(0)
请参阅 Difference in System. exit(0) , System.exit(-1), System.exit(1 ) in Java
答案 3 :(得分:1)
首先执行带有
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
块只会部分执行。
答案 4 :(得分:1)
Thread.stop()
导致在目标线程中抛出异常。这是异步发生的,也可能在执行finally
块时发生。在这种情况下,finally
块将突然完成,但允许它发生的线程继续执行。
try {
try {
...code...
} finally {
...resource cleanup, ThreadDeath thrown here...
}
} catch (ThreadDeath t) {
System.out.println("Thread was ordered to stop, ignoring.");
}