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 catchw tym samym trybloku.
2. Twój wyjątek
Nawiasem mówiąc, możesz sam utworzyć obiekt wyjątku: jest to po prostu obiekt typu Exceptionlub 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 RuntimeExceptioni 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-catchdo 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 finallynadal będzie wykonywany.
Nawiasem mówiąc, jeśli nie chcesz wychwytywać wyjątku, ale finallypotrzebujesz 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