Java 仮想マシン (以下、JVM) はコードを処理し、メソッドを順番に実行します
main
。次のメソッドに到達すると、このメソッドがスタックの最上位にあることが示されます。メソッドが完全に実行されると、そのメソッドはスタックから削除され、キュー内の次のメソッドに置き換えられます。原理を示すには、次のコードを入力します。
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
。これをちょっと想像してみてください。main
上m1
から上まで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 は、ゼロ除算エラーを捕捉する方法で処理されることを保証しましたArithmeticException
。m2
および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... に感謝します。 m1
main
main
GO TO FULL VERSION