Предыдущий ответ получает Java-часть этого права:
Если в вашем главном
нить, это может быть терминал, но если это
происходит в другом потоке это не
Терминал. Это терминал для основного
нить, если другие темы в
Приложение - это потоки демона.
Большая истина в том, что JVM, в которой работает ваше приложение, будет закрываться, когда не запущены потоки, не являющиеся демонами. Это или явный вызов System.exit (или явный сбой JVM) - единственные пути полного выхода JVM.
Во многих более простых Java-приложениях имеется только 1 поток, не являющийся демоном (поток, в котором JVM начала запускать main () при запуске.) Поскольку в простом случае поток, выполняющий наш код, является единственным Поток, не являющийся демоном, создает впечатление, что необработанное исключение приводит к выходу JVM. Это не так, если только этот поток не является единственным оставшимся потоком, не являющимся демоном.
Вы можете доказать это себе с помощью следующей маленькой программы:
public class TestMain {
public static void main(String[] args) {
Thread t1 = new Thread() {
public void run() {
while(true) {
System.out.println("A");
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
System.out.println("t1 interrupted.");
}
}
}
};
t1.setDaemon(false);
Thread t2 = new Thread() {
public void run() {
int count = 0;
while(true) {
if(count < 5) {
System.out.println("B");
count++;
} else {
throw new RuntimeException("Intentional RuntimeException!");
}
try {
Thread.sleep(2000);
} catch (InterruptedException e) {
System.out.println("t2 interrupted.");
}
}
}
};
t2.setDaemon(false);
t1.start();
t2.start();
}
}
Если вы запустите это, вы заметите, что вы получаете смешанные буквы «A» и «B» до 5-го «B», после чего вы получаете стековую трассировку исключения, которое мы сгенерировали, и « A "продолжается (" B "не продолжается, потому что этот поток только что умер из-за необработанного исключения.)
Теперь, если вы вернетесь назад и измените t1.setDaemon(false)
на t1.setDaemon(true)
и снова запустите, вы увидите, что когда t2 завершает работу из-за исключительной ситуации, не останется потоков, не являющихся демонами, и JVM завершит работу. .
Это отвечает на вопрос «почему некоторые ошибки не закрывают JVM». Но это не отвечает на часть вопроса о том, почему в Eclipse появляется отладчик.
Ответ на этот вопрос более прост (но я немного менее уверен в этом ... кто-то еще вмешивается): отладчик Eclipse приостанавливает каждый раз, когда поток умирает из-за необработанного исключения. Это делает предположение, что вы не хотели, чтобы поток умер, и что вам нужно исправить ошибку. Я полагаю, что на самом деле он отслеживает исключение java.lang.ThreadDeath и приостанавливает его в любое время.