0

ときどき Eclipse が「この行をデバッグするべきだ!!!」と言うことがあります。しかし、実際にはプログラムを閉じません。その後、ビッグ 2 をプレイし続け、最初にエラーを引き起こしたのと同じイベントを実行して、別のエラー ボックスが表示されることさえあります。

バグは単純です。修正します。なぜ一部のバグが終末期で、一部のバグが終末期ではないのかを知りたいだけです。違いは何ですか?

4

4 に答える 4

7

プログラミングの間違いは、次のカテゴリに分類できます。

  1. コンパイル時にコンパイラによってキャッチされ、修正せずにコンパイル時のエラーが発生すると、プログラムをまったく実行できなくなります。
  2. 実行時エラーは、コンパイラによってキャッチされませんが、処理されない例外など、コンピューターが自分で何をすべきかを理解できない状況に置かれます。ほとんどの場合、これによりプログラムが実行時に失敗し、クラッシュします。
  3. 有効なコンピューター プログラムであるため、コンピューターが完全に許容できる論理エラーですが、期待した結果が得られません。コンピュータはあなたの意図を知らないので、コンピュータがそれらをキャッチする方法はありません。

実際には、エラーが発生したらすぐに致命的なものにするのは良いことです。これにより、それらをより早く見つけて修正しやすくなります。これが、Java などの「より安全な」言語で例外をチェックした理由であり、未処理の例外によりアプリケーションがすぐにクラッシュし、おそらく誤った結果が生成されることはありません。

于 2008-12-15T12:53:25.790 に答える
2

あなたの場合、例外が発生したスレッドがすべてだと思います(アプリは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)行のタグを解除すると、動作の違いがわかります。

于 2008-12-15T13:02:35.927 に答える
2

以前の回答は、この権利の 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 例外を監視しており、例外がスローされるたびに一時停止していると思います。

于 2008-12-15T16:10:44.643 に答える
0

たとえば、銀行で使用されているソフトウェアを想像してみてください。

あなたの普通預金口座では、彼らは次の行を作成しました:

Account -= Interest;

これは明らかにバグですが、システムがクラッシュすることはありません。

于 2008-12-15T13:15:59.300 に答える