JavaRush /Java Blog /Random-JA /Javaスタックトレース
IvanDurov
レベル 25

Javaスタックトレース

Random-JA グループに公開済み
Java 仮想マシン (以下、JVM) はコードを処理し、メソッドを順番に実行しますmain。次のメソッドに到達すると、このメソッドがスタックの最上位にあることが示されます。メソッドが完全に実行されると、そのメソッドはスタックから削除され、キュー内の次のメソッドに置き換えられます。原理を示すには、次のコードを入力します。 Java スタック トレース - 1
package errorhandling;

public class errorChecking {
    public static void main(String[] args) {
        System.out.println("Метод Main успешно запущен");
        m1();
        System.out.println("Метод Main заканчивает свою работу");
    }

    static void m1() {
        System.out.println("Первый метод передаёт привет!(m1)");
        m2();
    }

    static void m2() {
        System.out.println("Второй метод передаёт привет(m2)");
    }
}
mainメソッド、 メソッドm1、 メソッド の 3 つのメソッドがありますm2。プログラムが開始されると、メソッドはスタックの最上位に配置されますmain。メソッド内でmainメソッドが呼び出されますm1。呼び出されると、スタックの一番上にジャンプします。メソッドはm1次に を呼び出しますm2。ここで、メソッドはm2スタックの先頭にジャンプし、一時的に を削除しますm1。これをちょっと想像してみてください。mainm1から上までm2!業務を完了すると終了し、m2制御が に戻りますm1。メソッドm1も完了するとスタックから削除され、制御が再びメソッドに与えられますmain。プログラムを実行し、出力ウィンドウを確認します。 Main メソッドは正常に実行されます。 最初のメソッドは hello!(m1) と表示されます。 2 番目のメソッドは hello(m2) と表示されます。 Main メソッドは終了します。 メソッドで何か問題が発生した場合m2、JVM (Java 仮想マシン) )、覚えていますよね?) は、 block などのエラー ハンドラーを探しますtry … catch。エラー ハンドラー メソッドにエラーがない場合は、例外を処理できることを期待して、m1例外がメソッドに渡されます。m1ここでエラー ハンドラーが検出されない場合、例外は再びスタックを上に移動し、今度はメソッドに移動しますmain。メソッドがmain例外をキャッチしない場合、出力ウィンドウに奇妙なエラー メッセージが表示されます。例として、メソッドをm2次のようにします。
static void m2() {
    int x = 10;
    int y = 0;
    double z = x / y;
    System.out.println( z );
    System.out.println("Method Two - m2");
}
このメソッドにはゼロ除算エラーが含まれています。プログラムの完全版は次のとおりです。自分のバージョンで確認してください。
package errorhandling;

public class errorChecking {
    public static void main(String[] args) {
        System.out.println("Метод Main успешно запущен");
        m1();
        System.out.println("Метод Main заканчивает свою работу");
    }

    static void m1() {
        System.out.println("Первый метод передаёт привет!(m1)");
        m2();
    }

    static void m2() {
        int x = 10;
        int y = 0;
        double z = x / y;
        System.out.println( z );
        System.out.println("Method Two - m2");
    }
}
プログラムを実行し、出力ウィンドウ に何が表示されるかを確認します。 Main メソッドは正常に実行されました。 最初のメソッドは hello!(m1) と表示します。 スレッド "main" での例外 java.lang.ArithmeticException: / by zero at errorhandling.errorChecking.m2(<u >errorChecking.java:17</u>)、errorhandling.errorChecking.m1(<u>Solution.java:11</u>)、errorhandling.errorChecking.main(<u>>Solution.java:5</u>) >) プロセスは終了コード 1 で終了しました。 スタック トレースと呼ばれるものを見ています。青の下線が引かれた 3 行はメソッドを示しており、次の場所にあります。 Name_пакета.Name_класса.Name_метода 上から 1 行目は、メソッド内でエラーが発生した場所ですm2。Java は、ゼロ除算エラーを捕捉する方法で処理されることを保証しましたArithmeticExceptionm2およびm1メソッドにはmainエラー ハンドラーはありません。したがって、プログラムはデフォルトのエラーハンドラーでそれを処理しました。メソッドをm1次のように変更します。
try {
    System.out.println("Первый метод передаёт привет!(m1)");
    m2( );
}
catch (ArithmeticException err) {
    System.out.println(err.getMessage());
}
これで、メソッドがm2ブロック内にラップされましたtry。部分的にはcatch、スタック トレースで検出された例外のタイプを使用しますArithmeticException。コードを再度実行すると、出力ウィンドウに次のメッセージが表示されます。 Main メソッドは正常に実行されました。 最初のメソッドは hello!(m1) / by zero と表示します。 Main メソッドは終了します。 エラー メッセージが「/ by zero」として出力されたことに注目してください。 。メソッドはm2完全には実行されませんでしたが、エラーが発生したときに停止されました。その後、制御が戻されましたm1。これは、ブロック自体がエラーを認識したために発生しましたcatch。JVM は標準エラー ハンドラーに連絡しませんでしたが、ブロックの中括弧の間にメッセージを表示しましたcatch。プログラム自体は停止されていないことに注意してください。いつものように、コントロールは呼び出しmain元のメソッドに移動しました。m1そしてメソッドの最終行に「 End Main Methodmain 」を表示することができました。これはとてもとても重要です。以降の作業のためにの値が必要な場合は、 のどこかで行います。値が存在しない場合、プログラムは期待どおりにまったく動作しない可能性があります。出力ウィンドウにスタック トレースが表示されたら、最初の行が問題が発生した場所であり、残りの行 (もちろん存在する場合) は例外がスタック上に伝播された場所であり、通常は で終わることがわかります。homeandlearn.co.ukからの翻訳 : Sergei Sysoev、Treefeed... に感謝します。 m1mainmain
コメント
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION