ときどき Eclipse が「この行をデバッグするべきだ!!!」と言うことがあります。しかし、実際にはプログラムを閉じません。その後、ビッグ 2 をプレイし続け、最初にエラーを引き起こしたのと同じイベントを実行して、別のエラー ボックスが表示されることさえあります。
バグは単純です。修正します。なぜ一部のバグが終末期で、一部のバグが終末期ではないのかを知りたいだけです。違いは何ですか?
プログラミングの間違いは、次のカテゴリに分類できます。
実際には、エラーが発生したらすぐに致命的なものにするのは良いことです。これにより、それらをより早く見つけて修正しやすくなります。これが、Java などの「より安全な」言語で例外をチェックした理由であり、未処理の例外によりアプリケーションがすぐにクラッシュし、おそらく誤った結果が生成されることはありません。
あなたの場合、例外が発生したスレッドがすべてだと思います(アプリはGUIアプリですよね?)。メインスレッドで例外が発生した場合、それはターミナルである可能性がありますが、別のスレッドで発生した場合、それはターミナルではありません。アプリケーション内の他のスレッドがデーモンスレッドである場合、これはメインスレッドのターミナルです。スレッドがデーモンの場合、アプリケーションは、ステータスに関係なく、完了する前に終了します。それらがデーモンでない場合、アプリケーションはそれらが完了するのを待ってから終了します。
Eclipseフレームワークについてはよくわかりませんが、GUIスレッドの例外に対処できると思います。
私の例を示すサンプルJavaアプリを含めました。
public class ThreadTest {
public static void main(String[] args) {
Runnable test = new Runnable() {
public void run() {
try {
System.out.println("Sleeping");
Thread.sleep(5000);
System.out.println("Slept");
} catch (InterruptedException e) {
}
}
};
Thread t = new Thread(test);
//t.setDaemon(true);
t.start();
System.out.println("Waiting to fail");
throw new RuntimeException("Error");
}
}
t.setDaemon(true)行のタグを解除すると、動作の違いがわかります。
以前の回答は、この権利の Java 部分を取得します。
メインスレッドで例外が発生した場合、それは端末である可能性がありますが、別のスレッドで発生した場合、それは端末ではありません。アプリケーション内の他のスレッドがデーモン スレッドである場合、これはメイン スレッドのターミナルです。
より大きな真実は、実行中の非デーモン スレッドがなくなると、アプリケーションが実行されている JVM がシャットダウンするということです。それ、または System.exit への明示的な呼び出し (または完全な JVM クラッシュ) が、JVM が完全に終了する唯一の方法です。
多くの単純な Java アプリケーションでは、非デーモン スレッド (起動時に JVM が main() を実行するために開始したスレッド) が 1 つしかありません。スレッドでは、未処理の例外が原因で 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"' s continue (「B」は継続しません。これは、そのスレッドが未処理の例外のために終了したためです。)
ここで、戻って に変更t1.setDaemon(false)
してt1.setDaemon(true)
再度実行すると、例外が原因で t2 が終了したときに、デーモン以外のスレッドが残っていないことがわかり、JVM が終了します。
これは、「一部のバグが JVM を閉じないのはなぜですか」という質問に答えます。しかし、なぜ Eclipse がデバッガーをポップアップするのかという質問の一部には答えていません。
それに対する答えはもっと簡単です (しかし、私はそれについて少し確信が持てません... 他の誰かが声を上げます): Eclipse デバッガーは、未処理の例外が原因でスレッドが停止するたびに一時停止します。スレッドが死ぬことを意図しておらず、バグを修正する必要があると仮定しています。実際には java.lang.ThreadDeath 例外を監視しており、例外がスローされるたびに一時停止していると思います。
たとえば、銀行で使用されているソフトウェアを想像してみてください。
あなたの普通預金口座では、彼らは次の行を作成しました:
Account -= Interest;
これは明らかにバグですが、システムがクラッシュすることはありません。