Если я наберу Ctrl-C в командной строке, будет ли блок finally в Java все еще выполняться?

я запускаю свое Java-приложение в cmd.exe в Windows. Если я остановлю процесс принудительно, нажав Ctrl-C, и код в этот момент будет запущен в try блок, будет finally блок все равно будет выполняться?

в моих тестах кажется, что да, он выполняется.

4 ответов


в то время как ваш код, наконец, может быть выполнен на вашей машине Windows (я не мог воспроизвести его с Linux), согласно эта документация на finally:

Примечание: если JVM выходит во время попытки или код будет исполнен, то блок finally не выполняется. Аналогично, если поток, выполняющий try или catch код прерывается или убитый, блок finally может не выполнить, даже если приложение как совокупность продолжает.

поэтому я бы не использовал блок finally, чтобы убедиться, что часть кода выполняется, даже если пользователь пытается преждевременно выйти. Если вам это нужно, вы можете использовать, как Адриан Петреску сказано, Выключение Крючки


правильный способ гарантировать, что некоторый код запускается в ответ на сигнал операционной системы (что и делает Ctrl-C, он отправляет SIGINT) - зарегистрировать "shutdownHook". Вот и StackOverflow вопрос об обращении с ним, а вот статьи С более подробной информацией об обработке сигнала JVM, чем вы, вероятно, когда-либо захотите узнать.


в моем тесте на Windows 7, Sun Java 1.6, блок finally не выполнялся, если я нажал Ctrl-C во время этого блока try.

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

в зависимости от реализации ОС, как правило,sigkills предназначены для немедленной остановки приложений. В этой ситуации не желательно полагаться на finally block Для выполнения; это может быть в некоторых ситуациях, но обычно это не будет/не должно. The 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.