JavaRush /Blog Java /Random-PL /Śledzenie stosu Java
IvanDurov
Poziom 25

Śledzenie stosu Java

Opublikowano w grupie Random-PL
Wirtualna maszyna Java (zwana dalej JVM) przetwarza kod i uruchamia metody jedna po drugiej, zaczynając od metody main. Kiedy osiągnie następną metodę, mówi, że ta metoda znajduje się na szczycie stosu. Po całkowitym wykonaniu metody jest ona usuwana ze stosu i zastępowana następną w kolejce. Aby zademonstrować zasadę, wpisz ten kod: Śledzenie stosu 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)");
    }
}
Mamy trzy metody: metoda main, metoda m1i metoda m2. Po uruchomieniu programu metoda znajduje się na górze stosu main. Wewnątrz metody mainmetoda ta nosi nazwę m1. Po wywołaniu wskakuje na szczyt stosu. Metoda m1z kolei wywołuje metodę m2. Teraz metoda m2przeskakuje na górę stosu, tymczasowo usuwając m1. Wyobraź sobie to przez chwilę – mainna górze m1i na górze m2! Po wykonaniu swojej pracy m2kończy się i kontrola wraca do m1. Metoda m1po zakończeniu jest również usuwana ze stosu, a kontrola zostaje ponownie przekazana metodzie main. Uruchom program i spójrz na okno wyjściowe: Metoda Main działa pomyślnie Pierwsza metoda mówi cześć!(m1) Druga metoda mówi cześć(m2) Metoda Main kończy działanie Jeśli coś pójdzie nie tak w metodzie m2, JVM (Java Virtual Machine ), pamiętasz, prawda?) będzie szukać programów obsługi błędów, na przykład bloku try … catch. Jeśli w metodzie obsługi błędów nie ma błędów m1, to do metody zostanie przekazany wyjątek m1, w nadziei, że uda się go obsłużyć. Jeśli nie wykryje tutaj procedury obsługi błędów, wyjątek ponownie zostanie przeniesiony w górę stosu, tym razem do metody main. Jeśli metoda mainnie przechwyci wyjątku, w oknie wyjściowym zostanie wyświetlony dziwny komunikat o błędzie. Na przykład spraw, aby Twoja metoda m2wyglądała tak:
static void m2() {
    int x = 10;
    int y = 0;
    double z = x / y;
    System.out.println( z );
    System.out.println("Method Two - m2");
}
Metoda ta zawiera dzielenie przez błąd zerowy. Oto pełna wersja programu, sprawdź u siebie:
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");
    }
}
Uruchom program i zobacz, co wyświetli okno wyjściowe: Metoda Main została pomyślnie wykonana Pierwsza metoda mówi „cześć”!(m1) Wyjątek w wątku „main” java.lang.ArithmeticException: / o zero w errorhandling.errorChecking.m2(<u >errorChecking.java:17</u>) w errorhandling.errorChecking.m1(<u>Solution.java:11</u>) w errorhandling.errorChecking.main(<u>>Solution.java:5</u >) Proces zakończony kodem zakończenia 1. Patrzysz na coś, co nazywa się śladem stosu. Trzy linie podkreślone na niebiesko odnoszą się do Twoich metod i można je znaleźć w: Nazwa_пакета.Nazwa_класса.Nazwa_метода Pierwsza linia od góry wskazuje miejsce, w którym wystąpił błąd - w metodzie m2. Java zadbała o to, aby była obsługiwana w sposób ArithmeticExceptionuwzględniający dzielenie przez zero błędów. W metodach m2i nie ma procedury obsługi błędów m1. mainProgram przetworzył go więc przy użyciu domyślnej procedury obsługi błędów. Zmień metodę m1na następującą:
try {
    System.out.println("Первый метод передаёт привет!(m1)");
    m2( );
}
catch (ArithmeticException err) {
    System.out.println(err.getMessage());
}
Teraz zawinęliśmy metodę m2w blok try. Częściowo catchużywamy typu wyjątku wykrytego w śladzie stosu - ArithmeticException. Uruchom kod ponownie, a w oknie wynikowym zobaczysz następujący komunikat: Metoda Main przebiegła pomyślnie Pierwsza metoda mówi hello!(m1) / przez zero Metoda Main kończy działanie Zauważ, że komunikat o błędzie został wydrukowany jako: " / przez zero " . Metoda m2nie została wykonana całkowicie, ale została zatrzymana po wystąpieniu błędu. Następnie kontrolę przekazano z powrotem m1. Stało się tak dlatego, że catchsam blok rozpoznał błąd, JVM nie skontaktował się ze standardową procedurą obsługi błędów, lecz wyświetlił komunikat umieszczony pomiędzy nawiasami klamrowymi bloku catch. Należy pamiętać, że sam program nie został zatrzymany. Sterowanie jak zwykle poszło do metody mainz której m1zostało wywołane. Ostatnia linia metody mainmogła wyświetlić „ Zakończ metodę główną ”. To jest bardzo, bardzo ważne. Jeśli potrzebowałeś wartości z m1, do późniejszej pracy gdzieś w main. A jeśli tej wartości tam nie ma, Twój program może w ogóle nie działać zgodnie z oczekiwaniami. Kiedy zobaczysz ślad stosu w oknie wyjściowym, wiedz, że pierwsza linia to miejsce, w którym wystąpił problem, a pozostałe linie (jeśli oczywiście takie istnieją) to miejsce, w którym wyjątek został propagowany w górę stosu, zwykle kończąc się na main. Tłumaczenie z homeandlearn.co.uk Dziękujemy: Sergei Sysoev, Treefeed...
Komentarze
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION