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

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

Возможный дубликат:
Есть ли такой случай, когда в try\finally заблокировать окончательно не будет выполнено?

есть ли какой-нибудь код, который никогда не будет выполнять предложение finally?

4b9b3361

Ответ 1

Учебники Java

Не только для System.exit, но и для прерывания потока

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

Ответ 2

System.exit(0) - один из примеров. Если вы компилируете и выполняете ниже "Bye", никогда не будет напечатано.

public class Main {
    public static void main(String[] args) {
        try {
            System.out.println("Hi");
            System.exit(0);
        }
        finally {
            System.out.println("Bye!");
        }
    }
}

Ответ 3

System.exit(0), если не выбрасывает исключение безопасности.

Ответ 4

Вот еще один пример:

try {
    while (true) {
       System.err.println("Its great to be alive");
    }
} finally {
    System.err.println("I wish!");
}

Ответ 5

System.exit(0);

Ответ 6

Короче говоря, блок finally не выполняется, если JVM остановлен, когда поток находится внутри соответствующего блока try, или если поток убит с использованием некоторых механизмов низкого уровня (не Thread.stop()).

В дополнение к очевидным примерам с System.exit() даже нормальное выключение JVM может быть неожиданным для потоков демона:

public static void main(String[] args) throws Exception {
    final CountDownLatch c = new CountDownLatch(1);

    Thread t = new Thread() {
        public void run() {
            try {
                System.out.println("Entering try block");
                c.countDown();
                try {
                    Thread.sleep(5000);
                } catch (InterruptedException ex) {}
            } finally {
                System.out.println("Never printed");
            }
        }
    };
    t.setDaemon(true);
    t.start();
    c.await();
    System.out.println("Exiting main thread");
}

Ответ 7

Также на моей тренировке я нашел новое решение для этого, это может быть accepcable

try {
if (choice) {
  while (true) ;
} else {
  System.exit(1);
}
} finally {
code.to.cleanup();

}