1. Wyjątki
Wreszcie programiści pomyśleli o regulacji i automatyzacji obsługi błędów. Stało się tak, gdy wymyślono wyjątki . Teraz za pomocą mechanizmu wyjątków na świecie przetwarza się 80% sytuacji awaryjnych.
Jeśli jakiś naukowiec wymyślił wyjątki, to najprawdopodobniej obronił na ten temat swoją rozprawę doktorską. Jeśli programista to wymyślił, być może otrzymał przyjacielskie poklepanie po ramieniu od kolegów: „Wydaje się, że to normalne, bracie”.
Gdy w programie Java wystąpi błąd, taki jak dzielenie przez 0
, dzieją się cudowne rzeczy:
Krok pierwszy
Tworzony jest specjalny obiekt wyjątku, który zawiera informacje o wystąpieniu błędu.
Wszystko w Javie jest obiektem, a wyjątki nie są wyjątkiem 🙂 Obiekty wyjątków mają swoje własne klasy, a od zwykłych klas różnią się tylko tym, że są dziedziczone z klasy Throwable
.
krok drugi
Obiekt wyjątku jest „rzucany”. Niezbyt dobre imię. „Zgłaszanie wyjątku” jest w istocie bardziej jak aktywacja alarmu przeciwpożarowego lub ostrzeganie cię za pomocą „alarmu bojowego”.
W momencie „wrzucenia” do systemu wyjątku normalne działanie programu zostaje zakończone, a rozpoczyna się „praca według protokołu awaryjnego”.
Krok trzeci
Bieżąca metoda, która napotkała (zgłosiła) wyjątek, kończy się natychmiast. Wyjątek jest przekazywany do metody wywołującej, która również kończy się natychmiast. I tak dalej w łańcuchu, aż metoda się skończy main
. Gdy metoda się kończy, main
program również się kończy.
Przykład:
Kod | Wyjście na wyświetlaczu |
---|---|
|
|
Wystąpił błąd w linii 20 - dzielenie przez 0 . Maszyna Java natychmiast stworzyła wyjątek - obiekt klasy ArithmeticException
i "wrzuciła" go do systemu.
Metoda поделим()
zakończyła się natychmiast, więc linia nie pojawiła się na ekranie Nic strasznego się nie stało: 0. Program wrócił do metody конецСвета()
i sytuacja się powtórzyła: w systemie jest wyjątek, co oznacza, że metoda конецСвета()
również się zawiesza . Następnie metoda zostaje zakończona main
, a wykonywanie programu zostaje zatrzymane.
Jaki jest cel takich wyjątków? I fakt, że w swoim programie możesz przechwytywać wyjątki określonego typu i pisać własną logikę obsługi sytuacji awaryjnych.
2. Łapanie wyjątkówtry-catch
Java ma mechanizm przechwytywania wyjątków, który pozwala zapobiegać awariom metod. To wygląda tak:
try
{
kod, где может возникнуть ошибка
}
catch(ТипИсключения Nazwa)
{
kod обработки исключения
}
Ten projekt nazywa się blokiem try-catch
.
Kod wyjątku jest ujęty w nawiasy klamrowe poprzedzone słowem try
(try).
Po nawiasach klamrowych zapisywane jest słowo kluczowe catch
, wewnątrz nawiasów deklarowana jest zmienna typu wyjątku . Po nim następują nawiasy klamrowe, wewnątrz których zapisany jest kod, który ma zostać wykonany w przypadku wystąpienia wyjątku określonego typu.
Jeśli podczas wykonywania „ kodu głównego ” nie zostały zgłoszone żadne wyjątki , kod wewnątrz bloku catch nie zostanie wykonany. Jeśli wystąpi wyjątek, tak się stanie (pod warunkiem, że typ wyjątku, który wystąpił, odpowiada typowi zmiennej w nawiasach).
Przykład:
Kod | Wyjście na wyświetlaczu |
---|---|
|
|
3. Wiele blokówcatch
Teoretycznie w bloku kodu mogą wystąpić różne wyjątki. Niektóre będziesz chciał przetwarzać w jeden sposób, inne w drugi, a jeszcze inne zdecydujesz się w ogóle nie przetwarzać.
Programiści Javy postanowili ci pomóc i pozwolili pisać po bloku try
nie jeden blok catch
, ale kilka.
try
{
kod, где может возникнуть ошибка
}
catch(ТипИсключения1 Nazwa1)
{
kod обработки исключения1
}
catch(ТипИсключения2 Nazwa2)
{
kod обработки исключения2
}
catch(ТипИсключения3 Nazwa3)
{
kod обработки исключения3
}
Przykład:
Kod | Wyjście na wyświetlaczu |
---|---|
|
|
4. Zablokuj zamówieniecatch
Wyjątek zgłoszony w bloku try
może zostać przechwycony tylko przez jeden blok catch
. Nie może być sytuacji , że podczas obsługi wyjątku został wykonany kod z kilku bloków catch
.
Jednak kolejność bloków ma znaczenie.
Może wystąpić sytuacja, w której wyjątek zostanie przechwycony przez wiele bloków. W takim przypadku zostanie przechwycony przez blok catch , który pojawi się wcześniej (bliżej bloku try
).
Jak może dojść do sytuacji, w której jeden wyjątek może przechwycić kilka bloków catch?
Wszystkie wyjątki są łączone w jedną hierarchię za pomocą dziedziczenia — patrz diagram.
Obiekt wyjątku typu ArithmeticException
można przypisać do zmiennej typu ArithmeticException
, jak również do zmiennych jej klas przodków: RuntimeException
, Exception
oraz Throwable
- patrz diagram.
Porozmawiamy więcej o dziedziczeniu i klasach przodków na poziomie 21.
Ten kod skompiluje się dobrze:
Korzyści z dziedziczenia: |
---|
|
Dlatego możliwe jest przechwycenie wyjątku typu ArithmeticException
za pomocą bloków catch
dowolnego z 4 typów podanych powyżej.
Przykład 1:
Kod | Wyjście na wyświetlaczu |
---|---|
|
|
W tym przykładzie wyjątek ArithmeticException
może zostać przechwycony zarówno przez blok, catch(Exception e)
jak i przez blok catch(ArithmeticException e)
. Zostanie przechwycony przez blok, który jest najbliżej bloku try
- pierwszy blok catch
.
Aby uniknąć niespodzianek, najlepiej jest catch
umieszczać bloki, które mogą przechwycić prawie wszystkie wyjątki, blisko końca listy bloków catch
.
Typ Throwable
jest generalnie zdolny do przechwytywania wszystkich możliwych wyjątków w Javie, jeśli zostanie umieszczony w pierwszym bloku catch
- kod nie skompiluje się, ponieważ kompilator rozumie, że w kodzie znajdują się nieosiągalne bloki kodu.
GO TO FULL VERSION