如果我在命令行上键入Ctrl-C,Java中的finally块是否仍会执行?

时间:2011-02-06 05:20:03

标签: java signals finally

我正在Windows中的cmd.exe中运行我的Java应用程序。如果我按Ctrl-C强行停止该过程,并且当时的代码在try块中运行,finally块是否仍会被执行?

在我的测试中,似乎是,它已被执行。

4 个答案:

答案 0 :(得分:15)

确保运行某些代码以响应操作系统信号(这是Ctrl-C执行的操作,它发送SIGINT)的正确方法是注册“shutdownHook”。这是关于处理它的StackOverflow question,这里有an article,其中有关JVM信号处理的更多细节,而不是你可能想知道的。

答案 1 :(得分:11)

虽然您的最终代码可能已在您的Windows机器上执行(我无法使用Linux重现它),但根据this documentation on finally

  

注意:如果JVM在尝试时退出   或者正在执行catch代码   finally块可能无法执行。   同样,如果线程执行   尝试或捕获代码被中断或   杀了,终于阻止了   即使应用程序执行也执行   整体还在继续。

因此,即使用户试图提前退出,我也不会使用finally块来确保执行一段代码。如果您需要,可以使用Adrian Petrescu提及的Shutdown Hooks

答案 2 :(得分:3)

在我的Windows 7,Sun Java 1.6测试中,如果在此try块中按下Ctrl-C,则finally块不会执行。

public static void main(String[] args) {
    try {
        for (int i = 0; i < 1000; i++) {
            System.out.println(i);
        }
    }
    finally {
        System.out.println("finally");
    }
}

答案 3 :(得分:0)

根据操作系统的实现,通常sigkills意味着立即停止应用程序。在这种情况下,不希望依赖finally块来执行;它可能在某些情况下,但通常它会/不应该。 java.lang.Runtime文档进一步支持:

In rare circumstances the virtual machine may abort, that is, stop running without shutting down cleanly. This occurs when the virtual machine is terminated externally, for example with the SIGKILL signal on Unix or the TerminateProcess call on Microsoft Windows. The virtual machine may also abort if a native method goes awry by, for example, corrupting internal data structures or attempting to access nonexistent memory. If the virtual machine aborts then no guarantee can be made about whether or not any shutdown hooks will be run.