Возможный дубликат:
Есть ли такой случай, когда в try\finally заблокировать окончательно не будет выполнено?
есть ли какой-нибудь код, который никогда не будет выполнять предложение finally?
Возможный дубликат:
Есть ли такой случай, когда в try\finally заблокировать окончательно не будет выполнено?
есть ли какой-нибудь код, который никогда не будет выполнять предложение finally?
Не только для System.exit, но и для прерывания потока
Примечание. Если JVM завершает работу во время выполнения кода try или catch, то блок finally не будет выполнить. Аналогично, если поток выполнение кода try или catch прерван или убит, наконец блок не будет выполняться, даже если приложение в целом продолжается.
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!");
}
}
}
System.exit(0)
, если не выбрасывает исключение безопасности.
Вот еще один пример:
try {
while (true) {
System.err.println("Its great to be alive");
}
} finally {
System.err.println("I wish!");
}
System.exit(0);
Короче говоря, блок 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");
}
Также на моей тренировке я нашел новое решение для этого, это может быть accepcable
try {
if (choice) {
while (true) ;
} else {
System.exit(1);
}
} finally {
code.to.cleanup();
}