如果以下代码是从IDE或命令行运行,然后停止:
从不执行finally子句(“最后”从未打印出来。)
public class Test {
public static void main(String[] args) {
try {
while (true) {
Thread.sleep(1000);
}
} catch (InterruptedException e) {
e.printStackTrace();
} finally {
System.out.println("Finally");
}
}
}
如果try块的执行正常完成,那么finally 块被执行,然后有一个选择:
任何见解?
修改
糟糕,我的错,有限的for循环导致finally子句被调用。我没有注意到我的单元测试中的痕迹。所以他们现在不是问题。
答案 0 :(得分:5)
执行永远不会离开while循环。如果您执行“红色按钮”,它将终止整个过程 - 因此之后其他任何代码都无法执行(除非它是JVM的关闭钩子)
答案 1 :(得分:2)
- 从eclipse(红色按钮)停止执行
- 按CTRL + C(命令行)
在这些情况下,您终止JVM,因此try块不会“正常”完成。没有JVM,没有Java字节码的解释。
- 当然(通过for循环替换while(true)循环
不确定这里发生了什么。如果for循环是可终止的(不是无限循环),这应该有效。请发布您的代码。
答案 2 :(得分:2)
如果我错了,请纠正我,你说当你退出程序时,最后一块没有运行?如果是这样,那么你期待finally块的错误行为。最终将在代码经历它的正常过程时运行。例如,当try完成时(成功或有错误)。你正在停止该计划,在这种情况下,没有其他任何进展。最终意味着是错误处理的一部分。停止程序不是错误处理,哈哈。
答案 3 :(得分:0)
最后块将始终执行,除非您通过程序调用system.exit()。这并不意味着当您强行停止完全关闭jvm的应用程序时会调用它。
答案 4 :(得分:0)
通过: 从eclipse停止执行(红色按钮) 按CTRL + C(命令行)
你正在杀死进程,之后没有执行任何操作。
通过for循环替换while(true)循环,这将最终到达。
即使使用例外,也会触发finally块。
try{
for(int i = 0; i < 10; i++);
throw new RuntimeException("Ex");
}catch(Throwable e){
System.out.println("thrown");
}finally{
System.out.println("finally");
}
这将打印:最后抛出
即使没有例外,最终会触发异常
try{
throw new RuntimeException("Ex");
}finally{
System.out.println("finally");
}
最后打印然后应用程序收到RuntimeException。
完全杀死进程的另一种方法是调用System.exit,它不会再执行任何代码(又名:其他代码和你的最终代码)
try{
System.exit(0);
}finally{
System.out.println("finally");
}
这不会打印任何内容。
答案 5 :(得分:0)
您正在做的是在完成该过程之前终止该过程。
您可以使用shutdownhook
来处理以下情况:
e.g。下面
package com.test;
public class Test {
public static void main(String[] args) {
Test test = new Test();
test.attachShutDownHook();
try {
while (true) {
Thread.sleep(1000);
}
} catch (InterruptedException e) {
e.printStackTrace();
} finally {
System.out.println("Finally");
}
}
public void attachShutDownHook() {
Runtime.getRuntime().addShutdownHook(new Thread() {
@Override
public void run() {
System.out.println("Inside Add Shutdown Hook");
}
});
System.out.println("Shut Down Hook Attached.");
}
}
只有在异常或程序正常终止时才会调用 Finally
。
答案 6 :(得分:0)
这是一个无限循环。你应该设一个断点。
boolean myFlag = true;
while(myFlag) {
doSomething();
myFlag = false;
}
或者您可以使用标志来设置循环何时结束。
@Override
public boolean dispatchTouchEvent(MotionEvent event) {
System.out.println("android test "+event.toString());
return super.dispatchTouchEvent(event);
}