JavaRush /Java 博客 /Random-ZH /Java 堆栈跟踪
IvanDurov
第 25 级

Java 堆栈跟踪

已在 Random-ZH 群组中发布
Java 虚拟机(以下简称 JVM)处理代码并从 method 开始依次运行方法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和方法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_метода 从顶部开始的第一行是发生错误的位置 - 在方法中m2ArithmeticExceptionJava 确保以捕获除零错误的方式对其进行处理。m2m1和方法中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...
评论
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION