„Още няколко интересни урока. О, колко обичам да преподавам!“
„Бих искал да ви разкажа за това How работят множество catch блокове. Много е просто: когато възникнат изключения в try блок, изпълнението се премества към първия catch блок.“
"Ако тип, посочен в скобите на catch блока, съвпада с типа на хвърленото изключение, тогава изпълнението започва вътре в този блок. В противен случай преминаваме към следващия catch блок, където се извършва същата проверка."
„Ако ни свършат catch блоковете и изключението не е уловено, то ще бъде хвърлено отново и текущият метод ще прекрати необичайно.“
„Разбирам. Блокът catch, който съвпада с типа изключение, ще бъде този, който ще бъде изпълнен.“
„Да, така е. В действителност обаче е малко по-сложно. Класовете могат да наследяват други класове. Ако клас Cow наследи клас Animal, обектът Cow може да бъде рефериран не само от променлива Cow, но и от променлива Animal. "
"И?"
„Тъй като всички изключения наследяват Exception or RuntimeException (което също наследява Exception ), те все още могат да бъдат уловени с помощта на „catch ( Exception e)“ or „ catch (RuntimeException e) “.“
"И?"
„Можем да направим две заключения. Първо, можете да използвате „catch (Exception e)“, за да уловите всяко изключение. Второ, редът на catch блоковете има meaning. “
"Ето няколко примера:"
„Това ArithmeticException
, което се случва, след като разделим на 0, ще бъде уловено във втория блок за улавяне.“
try
{
System.out.println("Before calling method1.");
int a = 1 / 0;
System.out.println("After calling method1. This will never be shown.");
}
catch (NullPointerException e)
{
System.out.println("Null reference. Exception has been caught.");
}
catch (ArithmeticException e)
{
System.out.println("Division by zero. Exception has been caught.");
}
catch (Exception e)
{
System.out.println("Any other errors. Exception has been caught.");
}
"В примера по-долу, ArithmeticException
ще бъде уловен в първия catch блок, тъй като всички изключения наследяват Exception, т.е. Exception
обхваща всички изключения. "
try
{
System.out.println("Before calling method1.");
int a = 1/0;
System.out.println("After calling method1. This will never be shown.");
}
catch (Exception e)
{
System.out.println("Any other errors. Exception has been caught.");
}
catch (NullPointerException e)
{
System.out.println("Null reference. Exception has been caught.");
}
catch (ArithmeticException e)
{
System.out.println("Divided by zero. Exception has been caught.");
}
„В примера по-долу ArithmeticException
няма да бъде уловен. Ще бъде прехвърлен към извикващия метод.“
try
{
System.out.println("Before calling method1.");
int a = 1/0;
System.out.println("After calling method1. This will never be shown.");
}
catch (NullPointerException e)
{
System.out.println("Null reference. Exception has been caught.");
}
„Това малко изясни нещата. Тези изключения не са най-лесната тема.“
"Само изглежда така. Те всъщност са едно от най-простите неща в Java."
„Не знам дали да се радвам or да се натъжа за това…“
GO TO FULL VERSION