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
try
{
   int d = 2/0;
}
catch(Exception except)
{
   System.out.println("ПерехватLub исключение");
   throw except;
}
ПерехватLub исключение

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
try
{
   throw new RuntimeException();
}
catch(Exception except)
{
   System.out.println("ПерехватLub исключение");
   throw except;
}
ПерехватLub исключение

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, который нужно выполнить в любом случае
}