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:
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 m1
i metoda m2
. Po uruchomieniu programu metoda znajduje się na górze stosu main
. Wewnątrz metody main
metoda ta nosi nazwę m1
. Po wywołaniu wskakuje na szczyt stosu. Metoda m1
z kolei wywołuje metodę m2
. Teraz metoda m2
przeskakuje na górę stosu, tymczasowo usuwając m1
. Wyobraź sobie to przez chwilę – main
na górze m1
i na górze m2
! Po wykonaniu swojej pracy m2
kończy się i kontrola wraca do m1
. Metoda m1
po 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 main
nie przechwyci wyjątku, w oknie wyjściowym zostanie wyświetlony dziwny komunikat o błędzie. Na przykład spraw, aby Twoja metoda m2
wyglą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 ArithmeticException
uwzględniający dzielenie przez zero błędów. W metodach m2
i nie ma procedury obsługi błędów m1
. main
Program przetworzył go więc przy użyciu domyślnej procedury obsługi błędów. Zmień metodę m1
na następującą:
try {
System.out.println("Первый метод передаёт привет!(m1)");
m2( );
}
catch (ArithmeticException err) {
System.out.println(err.getMessage());
}
Teraz zawinęliśmy metodę m2
w blok try
. Częściowo catch
uż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 m2
nie 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 catch
sam 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 main
z której m1
zostało wywołane. Ostatnia linia metody main
mogł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...
GO TO FULL VERSION