1. Operatorthrow
Wyjątek, dopóki nie zostanie wrzucony do systemu, lub gdy zostanie już przechwycony przez blok catch
, jest w zasadzie tylko obiektem klasy odziedziczonej z Exception
(a raczej z Throwable
). Sam obiekt wyjątku nie ma żadnych magicznych cech.
Cała logika działania wyjątków to po prostu specjalny sposób, w jaki maszyna Java zachowuje się, gdy wyjątek jest zgłaszany do jej środowiska wykonawczego.
Zawsze możesz ponownie rzucić maszynę Java z wyjątkiem, który właśnie złapałeś. Aby to zrobić, musisz użyć operatora throw
:
throw исключение;
Przykład:
Kod | Wyjście na wyświetlaczu |
---|---|
|
|
W tym kodzie złapaliśmy wyjątek, wyświetliliśmy komunikat o nim na ekranie i rzuciliśmy go ponownie.
Ponownie zgłoszony wyjątek nie może zostać przechwycony przez inne bloki catch
w tym samym try
bloku.
2. Twój wyjątek
Nawiasem mówiąc, możesz sam utworzyć obiekt wyjątku: jest to po prostu obiekt typu Exception
lub klasa odziedziczona po nim. I wyrzuć to.
To łatwiejsze niż się wydaje. Przykład:
Kod | Wyjście na wyświetlaczu |
---|---|
|
|
W powyższym przykładzie stworzyliśmy obiekt wyjątku nowego typu RuntimeException
i natychmiast go odrzuciliśmy, używając metody throw
.
Zostanie natychmiast przechwycony przez blok catch
, ponieważ type RuntimeException jest dziedziczony z type Exception
. Kod catch(Exception except)
przechwytuje obiekty wyjątków wszystkich klas, które dziedziczą po Exception
.
3. Słowo kluczowefinally
Kolejny ważny punkt. Czasami programista musi podjąć jakąś akcję, niezależnie od tego, czy w kodzie był wyjątek, czy nie. Na przykład w kodzie otworzyliśmy plik do zapisu, a otwarty plik należy zamknąć, wywołując funkcję close()
.
try
{
kod, где может возникнуть ошибка
}
catch(ТипИсключения Nazwa)
{
kod обработки исключения
}
finally
{
kod, который нужно выполнить в любом случае
}
Aby wykonać takie obowiązkowe działania, try-catch
do operatora - dodano kolejny blok finally
, a wynikiem był operator try-catch-finally
. Ta rzecz wygląda tak:
Przykład:
FileInputStream source = null;
try
{
source = new FileInputStream("c:\\note.txt");
source.read();
}
catch(Exception except)
{
System.out.println("ПерехватLub исключение");
throw except;
}
finally
{
if (source != null)
source.close();
}
Kod w bloku finally
zostanie wykonany w każdym przypadku, niezależnie od tego, czy wystąpił wyjątek, czy nie. Nawet jeśli wyjątek został zgłoszony i nie został złapany, blok finally
nadal będzie wykonywany.
Nawiasem mówiąc, jeśli nie chcesz wychwytywać wyjątku, ale finally
potrzebujesz bloku, użyj skrótu notacji bloku try-catch-finally
- try-finally
. Wygląda to mniej więcej tak:
try
{
kod, где может возникнуть ошибка
}
finally
{
kod, который нужно выполнить в любом случае
}
GO TO FULL VERSION