JavaRush /Java Blog /Random-TW /Java 堆疊追蹤
IvanDurov
等級 25

Java 堆疊追蹤

在 Random-TW 群組發布
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