最后一句不总是叫?

时间:2015-06-24 13:44:54

标签: java finally

如果以下代码是从IDE或命令行运行,然后停止:

  • 从eclipse(红色按钮)停止执行
  • 按CTRL + C(命令行)
  • 当然(通过for循环替换while(true)循环

从不执行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");
        }
    }
}

引用Java 7 specifications

  

如果try块的执行正常完成,那么finally   块被执行,然后有一个选择:

任何见解?

修改

糟糕,我的错,有限的for循环导致finally子句被调用。我没有注意到我的单元测试中的痕迹。所以他们现在不是问题。

7 个答案:

答案 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来处理以下情况:

  • 因为它的所有线程都已完成执行
  • 因为调用了System.exit()
  • 因为用户点击CNTRL-C
  • 系统级关闭或用户注销

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);
}