„Бих искал да ви разкажа малко за това How работят изключенията . Примерът по-долу трябва да ви даде груба представа Howво се случва:“
class ExceptionExampleOriginal
{
public static void main(String[] args)
{
System.out.println("main begin");
try
{
System.out.println("main before call");
method1();
System.out.println("main after call");
}
catch (RuntimeException e)
{
String s = e.getMessage();
System.out.println(s);
}
System.out.println("main end");
}
public static void method1()
{
System.out.println("method1 begin");
method2();
System.out.println("method1 end");
}
public static void method2()
{
System.out.println("method2");
String s = "Message: Unknown Exception";
throw new RuntimeException(s);
}
}
public class ExceptionExample
{
private static Exception exception = null;
public static void main(String[] args)
{
System.out.println("main begin");
System.out.println("main before call");
method1();
if (exception == null)
{
System.out.println("main after call");
}
else if (exception instanceof RuntimeException)
{
RuntimeException e = (RuntimeException) exception;
exception = null;
String s = e.getMessage();
System.out.println(s);
}
System.out.println("main end");
}
public static void method1()
{
System.out.println("method1 begin");
method2();
if (exception != null) return;
System.out.println("method1 end");
}
public static void method2()
{
System.out.println("method2");
String s = "Message: Unknown Exception";
exception = new RuntimeException(s);
return;
}
}
— Съвсем съм се загубил.
— Добре. Нека ти обясня Howво става.
„В примера отляво извикваме последователно няколко метода. В method2, съзнателно създаваме и хвърляме изключение (създаваме грешка).“
„Примерът вдясно показва Howво се случва.
„Вижте method2. Вместо да създаваме изключение, ние създаваме обект RuntimeException, запазваме го в статичната променлива exceptionи след това незабавно излизаме от метода с помощта на returnоператор.“
"В method1, след извикване method2, ние проверяваме дали има изключение. Ако има изключение, то method1приключва веднага. Проверка като тази се извършва индиректно след всяко (!) извикване на метод в Java."
"Еха!"
"Уау е прав."
"В дясната колона използвах основния метод, за да покажа приблизително Howво се случва, когато изключение бъде уловено с помощта на конструкция try-catch. Ако няма изключение, тогава всичко продължава да работи според очакванията. Ако има изключение и то е от същия тип, посочен в оператора catch, тогава ние го обработваме."
"Какво правя throw и instanceof означавам? "
„Вижте последния ред: throw new RuntimeException(s);. Ето How създавате и хвърляте изключение. Все още няма да работим върху това. Това беше просто пример.“
„Използваме a instanceof B, за да проверим дали обектът aе от тип B, т.е. дали обектът, посочен от променливата изключение, е RuntimeException. Това е булев израз.“
— Мисля, че го разбрах. Почти.
GO TO FULL VERSION