Java 虚拟机(以下简称 JVM)处理代码并从 method 开始依次运行方法
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
和方法m2
。当程序启动时,该方法位于栈顶main
。在方法内部main
,调用该方法m1
。当被调用时,他跳到堆栈的顶部。该方法m1
依次调用m2
. 现在该方法m2
跳转到堆栈顶部,暂时删除m1
. 想象一下——main
在上面m1
,在上面m2
!完成其业务后,m2
它结束并且控制权返回到m1
。完成后,该方法m1
也会从堆栈中删除,并且控制权会再次交给该方法main
。运行程序并查看输出窗口: Main 方法运行成功 第一个方法说 hello!(m1) 第二个方法说 hello(m2) Main 方法退出 如果方法中出现问题m2
,JVM(Java 虚拟机) ),你还记得,对吧?)将寻找错误处理程序,例如块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) Exception in thread "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>) >) Process finish with exit code 1 您正在查看称为堆栈跟踪的内容。蓝色下划线的三行指的是您的方法,可以在以下位置找到: Name_пакета.Name_класса.Name_метода
从顶部开始的第一行是发生错误的位置 - 在方法中m2
。ArithmeticException
Java 确保以捕获除零错误的方式对其进行处理。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
并且该方法的最后一行main
能够显示“ End Main method ”。这非常非常重要。如果您需要来自 , 的值m1
以用于 中某处的后续工作main
。如果该值不存在,那么您的程序可能根本无法按您的预期运行。当您在输出窗口中看到堆栈跟踪时,只需知道第一行是问题发生的位置,其余行(当然如果有的话)是异常在堆栈中传播的位置,通常以main
. 翻译自homeandlearn.co.uk 我们感谢:Sergei Sysoev、Treefeed...
GO TO FULL VERSION