JavaRush /จาวาบล็อก /Random-TH /การติดตามสแต็ก Java
IvanDurov
ระดับ

การติดตามสแต็ก Java

เผยแพร่ในกลุ่ม
Java Virtual Machine (ต่อไปนี้จะเรียกว่า JVM) ประมวลผลโค้ดและรันวิธีการต่างๆ ตามลำดับ โดยเริ่มต้นด้วยmainmethod เมื่อถึงวิธีถัดไปก็บอกว่าวิธีนี้อยู่ด้านบนสุดของสแต็ก หลังจากที่ดำเนินการเมธอดอย่างสมบูรณ์แล้ว มันจะถูกลบออกจากสแต็กและแทนที่ด้วยเมธอดถัดไปในคิว เพื่อสาธิตหลักการ ให้พิมพ์รหัสนี้: การติดตามสแต็ก 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)");
    }
}
เรามีสามวิธี: method main, method m1และm2method เมื่อโปรแกรมเริ่มทำงาน วิธีการจะอยู่ที่ด้านบนสุดของสแต็mainก ภายใน method จะมี ชื่อว่าmainmethod m1เมื่อเรียกก็จะกระโดดขึ้นไปบนกอง วิธีการm1ในทางกลับกันจะเรียกm2. ตอนนี้เมธอดm2จะข้ามไปที่ด้านบนของสแต็ก โดยจะลบm1. ลองนึกภาพสิ่งนี้สักครู่ - mainบนm1และบนm2! เมื่อทำธุรกิจเสร็จm2ก็ยุติและการควบคุมกลับคืนm1สู่ เมื่อเสร็จแล้ว เมธอดm1จะถูกลบออกจากสแต็กด้วย และการควบคุมจะถูกกำหนดให้กับเมธอดอีกmainครั้ง รันโปรแกรมของคุณและดูที่หน้าต่างเอาท์พุต: วิธี Main ทำงานได้สำเร็จ วิธีแรกพูดว่า hello!(m1) วิธีที่สองพูดว่า hello(m2) วิธีการ Main จะออก หากมีสิ่งผิดปกติเกิดขึ้นในวิธีนั้นm2JVM (Java Virtual Machine ) คุณจำได้ใช่ไหม?) จะมองหาตัวจัดการข้อ try … catchผิดพลาด เช่น block หากไม่มีข้อผิดพลาดใน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");
    }
}
รันโปรแกรมและดูว่าหน้าต่างเอาท์พุตให้อะไรกับคุณ: วิธีการหลักทำงานได้สำเร็จ วิธีแรกบอกว่าสวัสดี!(m1) ข้อยกเว้นในเธรด "main" java.lang.ArithmeticException: / โดยศูนย์ที่ 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 คุณกำลังดูสิ่งที่เรียกว่าการติดตามสแต็ก บรรทัดสามบรรทัดที่ขีดเส้นใต้ด้วยสีน้ำเงินหมายถึงวิธีการของคุณ และสามารถพบได้ใน: Name_пакета.Name_класса.Name_метода บรรทัดแรกจากด้านบนคือตำแหน่งที่เกิดข้อผิดพลาด - ในวิธีm2การ Java รับประกันว่าได้รับการจัดการในลักษณะArithmeticExceptionที่ตรวจพบข้อผิดพลาดในการหารโดยไม่มีข้อผิดพลาด ไม่มีตัวจัดการข้อผิดพลาดในเมธอดm2และ ดังนั้นโปรแกรมจึงประมวลผลด้วยตัวจัดการข้อผิดพลาดเริ่มต้น เปลี่ยนวิธีการของคุณดังต่อไปนี้: m1mainm1
try {
    System.out.println("Первый метод передаёт привет!(m1)");
    m2( );
}
catch (ArithmeticException err) {
    System.out.println(err.getMessage());
}
ตอนนี้เราได้รวมวิธีการไว้m2ในบล็อกtryแล้ว ในส่วนหนึ่งcatchเราใช้ประเภทของข้อยกเว้นที่ตรวจพบในการติดตามสแต็กArithmeticException- เรียกใช้โค้ดอีกครั้งแล้วคุณจะเห็นสิ่งต่อไปนี้ในหน้าต่างเอาท์พุต: วิธีหลักทำงานได้สำเร็จ วิธีแรกบอกว่าสวัสดี! (m1) / โดยศูนย์ วิธีการหลักออก โปรด สังเกตว่าข้อความแสดงข้อผิดพลาดถูกพิมพ์เป็น: " / โดยศูนย์ " . วิธีการนี้m2ไม่ได้ดำเนินการอย่างสมบูรณ์ แต่ถูกหยุดลงเมื่อมีข้อผิดพลาดเกิดขึ้น จากนั้นการควบคุมก็ถูกโอนm1กลับ สิ่งนี้เกิดขึ้นเนื่องจากความจริงที่ว่าบล็อกcatchนั้นรับรู้ถึงข้อผิดพลาด JVM ไม่ได้ติดต่อกับตัวจัดการข้อผิดพลาดมาตรฐาน แต่แสดงข้อความที่อยู่ระหว่างเครื่องหมายปีกกาของcatchบล็อก โปรดทราบว่าตัวโปรแกรมไม่ได้หยุดทำงาน การควบคุมเป็นไปตามวิธีการmainที่m1เรียกว่า ตามปกติ และบรรทัดสุดท้ายของ method mainก็สามารถแสดง " End Main method " ได้ นี่เป็นสิ่งสำคัญมาก หากคุณต้องการค่า from m1สำหรับงานต่อไปในmain. และหากไม่มีค่าดังกล่าว โปรแกรมของคุณอาจไม่ทำงานอย่างที่คุณคาดหวัง เมื่อคุณเห็นการติดตามสแต็กในหน้าต่างเอาท์พุต โปรดทราบว่าบรรทัดแรกคือจุดที่เกิดปัญหา และบรรทัดที่เหลือ (ถ้ามี) เป็นที่ที่มีการแพร่กระจายข้อยกเว้นขึ้นไปบนสแต็ก ซึ่งโดยปกติจะลงท้ายด้วยmain. คำแปลจากhomeandlearn.co.uk เราขอขอบคุณ: Sergei Sysoev, Treefeed...
ความคิดเห็น
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION