JavaRush /Blog Java /Random-VI /Dấu vết ngăn xếp Java
IvanDurov
Mức độ

Dấu vết ngăn xếp Java

Xuất bản trong nhóm
Máy ảo Java (sau đây gọi là JVM) xử lý mã và chạy lần lượt các phương thức, bắt đầu bằng phương thức main. Khi đến phương thức tiếp theo, nó báo rằng phương thức này nằm ở đầu ngăn xếp. Sau khi một phương thức được thực thi đầy đủ, nó sẽ bị xóa khỏi ngăn xếp và được thay thế bằng phương thức tiếp theo trong hàng đợi. Để thể hiện nguyên tắc, hãy nhập mã này: Dấu vết ngăn xếp 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)");
    }
}
Chúng tôi có ba phương pháp: phương pháp main, phương pháp m1và phương pháp m2. Khi chương trình bắt đầu, phương thức này nằm ở đầu ngăn xếp main. Bên trong phương thức này main, phương thức này được gọi là m1. Khi được gọi, anh ta sẽ nhảy lên đầu ngăn xếp. Phương thức này m1lần lượt gọi m2. Bây giờ phương thức này m2nhảy lên đầu ngăn xếp, tạm thời xóa m1. Hãy tưởng tượng điều này trong một giây - maintrên cùng m1và trên cùng m2! Sau khi hoàn thành công việc của mình, m2nó kết thúc và quyền kiểm soát quay trở lại m1. Phương thức này m1, khi hoàn thành, cũng bị xóa khỏi ngăn xếp và quyền điều khiển lại được trao cho phương thức đó main. Chạy chương trình của bạn và nhìn vào cửa sổ đầu ra: Phương thức Main chạy thành công Phương thức đầu tiên là hello!(m1) Phương thức thứ hai là hello(m2) Phương thức Main thoát ra Nếu có lỗi xảy ra trong phương thức này m2, thì JVM (Máy ảo Java) ), bạn nhớ chứ?) sẽ tìm kiếm các trình xử lý lỗi, ví dụ như một khối try … catch. Nếu không có lỗi nào trong m1phương thức xử lý lỗi thì ngoại lệ sẽ được chuyển đến phương thức đó m1với hy vọng rằng nó có thể xử lý được. Nếu nó không phát hiện được trình xử lý lỗi ở đây, ngoại lệ sẽ lại di chuyển lên ngăn xếp, lần này là phương thức main. Nếu phương thức mainkhông bắt được ngoại lệ, bạn sẽ nhận được thông báo lỗi lạ được in trong cửa sổ đầu ra. Ví dụ: làm cho phương thức của bạn m2trông như thế này:
static void m2() {
    int x = 10;
    int y = 0;
    double z = x / y;
    System.out.println( z );
    System.out.println("Method Two - m2");
}
Phương pháp này có phép chia cho sai số bằng 0. Đây là phiên bản đầy đủ của chương trình, hãy kiểm tra với phiên bản của bạn:
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");
    }
}
Chạy chương trình và xem cửa sổ đầu ra cung cấp cho bạn những gì: Phương thức chính chạy thành công Phương thức đầu tiên là hello!(m1) Ngoại lệ trong luồng "main" java.lang.ArithmeticException: / by 0 tại errorhandling.errorChecking.m2(<u >errorChecking. java:17</u>) tại errorhandling.errorChecking.m1(<u>Solution.java:11</u>) tại errorhandling.errorChecking.main(<u>>Solution.java:5</u >) Quá trình đã hoàn tất với mã thoát 1 Bạn đang xem một thứ gọi là dấu vết ngăn xếp. Ba dòng được gạch chân màu xanh lam đề cập đến các phương thức của bạn và có thể tìm thấy trong: Name_пакета.Name_класса.Name_метода Dòng đầu tiên từ trên xuống là nơi xảy ra lỗi - trong phương thức m2. Java đảm bảo rằng nó được xử lý theo cách không ArithmeticExceptionxảy ra lỗi chia cho 0. Không có trình xử lý lỗi trong các phương thức m2, m1và . mainVì vậy chương trình đã xử lý nó bằng trình xử lý lỗi mặc định. Thay đổi phương pháp của bạn m1thành như sau:
try {
    System.out.println("Первый метод передаёт привет!(m1)");
    m2( );
}
catch (ArithmeticException err) {
    System.out.println(err.getMessage());
}
Bây giờ chúng ta đã gói phương thức này m2vào một khối try. Một phần catch, chúng tôi sử dụng loại ngoại lệ được phát hiện trong dấu vết ngăn xếp - ArithmeticException. Chạy lại mã và bạn sẽ thấy thông tin sau trong cửa sổ đầu ra: Phương thức chính chạy thành công Phương thức đầu tiên nói xin chào!(m1) / by 0 Phương thức chính thoát ra Lưu ý rằng thông báo lỗi được in dưới dạng: " / by zero " . Phương thức này m2không được thực thi hoàn toàn nhưng đã bị dừng khi xảy ra lỗi. Quyền kiểm soát sau đó đã được chuyển trở lại m1. Điều này xảy ra do catchchính khối đó đã nhận ra lỗi; JVM không liên hệ với trình xử lý lỗi tiêu chuẩn nhưng hiển thị một thông báo nằm giữa các dấu ngoặc nhọn của khối catch. Xin lưu ý rằng bản thân chương trình chưa bị dừng. Điều khiển, như thường lệ, đi đến phương thức mainm1nó được gọi. Và dòng cuối cùng của phương thức mainđã có thể hiển thị " End Main Method ". Điều này là rất, rất quan trọng. Nếu bạn cần giá trị từ m1, cho công việc tiếp theo ở đâu đó trong main. Và nếu không có giá trị thì chương trình của bạn có thể không hoạt động như bạn mong đợi. Khi bạn nhìn thấy dấu vết ngăn xếp trong cửa sổ đầu ra, chỉ cần biết rằng dòng đầu tiên là nơi xảy ra sự cố và các dòng còn lại (tất nhiên nếu có) là nơi ngoại lệ được truyền lên ngăn xếp, thường kết thúc bằng main. Bản dịch từ homeandlearn.co.uk Chúng tôi gửi lời cảm ơn tới: Sergei Sysoev, Treefeed...
Bình luận
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION