Подтвердить что ты не робот

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

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

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

4b9b3361

Ответ 1

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

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

Поэтому я бы не использовал блок finally, чтобы убедиться, что часть кода выполняется, даже если пользователь пытается преждевременно выйти. Если вам это нужно, вы можете использовать, например, Adrian Petrescu, Shutdown Hooks

Ответ 2

Правильный способ убедиться, что некоторый код запущен в ответ на сигнал операционной системы (что и делает Ctrl-C, он отправляет SIGINT), чтобы зарегистрировать "shutdownHook". Здесь fooobar.com/questions/141827/... об обработке, и здесь статья с более подробным описанием о обработке сигнала JVM, чем вы, вероятно, когда-либо захотите узнать.

Ответ 3

В моем тесте на 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");
    }
}

Ответ 4

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