1. throwоператор

Когато изключение бъде уловено от catchблок и докато не бъде хвърлено към Java машината, това е просто обект, който наследява Exception(or по-скоро Throwable). Самият обект на изключение няма ниHowви магически свойства.

Цялата логика на това How работят изключенията е просто специален начин, по който Java машината се държи, когато към нея бъде хвърлено изключение.

Винаги можете да хвърлите отново уловено изключение към Java машината. За да направите това, трябва да използвате throwоператора:

throw exception;

Пример:

Код Конзолен изход
try
{
   int d = 2/0;
}
catch(Exception except)
{
   System.out.println("Caught the exception");
   throw except;
}
Caught the exception

В този code ние хванахме изключение, показахме съобщение за него на екрана и след това го хвърлихме отново.

Повторно хвърлено изключение не може да бъде уловено от други catchблокове в същия tryблок.


2. Вашите изключения

Между другото, можете сами да създадете обект на изключение: това е просто обект, чийто тип е Exceptionor клас, който го наследява. И го хвърли.

По-лесно е, отколкото звучи. Пример:

Код Конзолен изход
try
{
   throw new RuntimeException();
}
catch(Exception except)
{
   System.out.println("Caught the exception");
   throw except;
}
Caught the exception

В примера по-горе създадохме нов обект за изключение, чийто тип е RuntimeExceptionи веднага го хвърлихме с помощта на throwоператора.

Той ще бъде незабавно уловен от catchблока, тъй като RuntimeException наследява Exception. Кодът catch (Exception except)улавя обекти-изключения от всички класове, които наследяват Exceptionкласа.



3. finallyключова дума

Друг важен момент. Понякога програмистът трябва да извърши няHowво действие, независимо дали е възникнало изключение в codeа. Да предположим например, че сме отворor файл за запис. Отвореният файл трябва да бъде затворен чрез извикване close().

try
{
   // Code where an exception might occur
}
catch(ExceptionType name)
{
   // Exception handling code
}
finally
{
   // Code that must executed no matter what happens
}

finallyЗа извършване на тези задължителни действия към конструкцията беше добавен друг вид блок ( ) try-catch, като по този начин се създаде try-catch-finallyконструкцията. Изглежда така:

Пример:

FileInputStream source = null;
try
{
   source = new FileInputStream("c:\\note.txt");
   source.read();
}
catch(Exception except)
{
   System.out.println("Caught the exception");
   throw except;
}
finally
{
   if (source != null)
      source.close();
}

Кодът в finallyблока ще се изпълни във всеки случай, независимо дали е имало изключение. Дори ако изключение е хвърлено и не е уловено, блокът finallyпак ще се изпълни.

Между другото, ако не искате да хванете изключение, но имате нужда от finallyблок, използвайте съкратената нотация за try-catch-finallyконструкцията: try-finallyблок. Изглежда нещо подобно:

try
{
   // Code where an exception might occur
}
finally
{
   // Code that must executed no matter what happens
}