Cum funcționează multi-captura - 1

"Încă câteva lecții interesante. Oh, cât de mult îmi place să predau!"

"Aș dori să vă spun cum funcționează mai multe blocuri catch . Este foarte simplu: când apar excepții într-un bloc try , execuția se mută la primul bloc catch ."

"Dacă un tip indicat în parantezele blocului catch se potrivește cu tipul excepției aruncate, atunci execuția începe în interiorul acelui bloc. În caz contrar, trecem la următorul bloc catch , unde se efectuează aceeași verificare."

„Dacă rămânem fără blocuri de captură și excepția nu a fost prinsă, va fi aruncată din nou, iar metoda actuală se va termina anormal.”

— Înțeleg. Blocul catch care coincide cu tipul de excepție va fi cel executat.

"Da, corect. Totuși, în realitate este puțin mai complicat. Clasele pot moșteni alte clase. Dacă o clasă Cow moștenește o clasă Animal, obiectul Cow poate fi referit nu numai printr-o variabilă Cow, ci și printr-o variabilă Animal. "

"Și?"

„Deoarece toate excepțiile moștenesc Exception sau RuntimeException (care moștenește și Exception ), ele pot fi încă prinse folosind „catch ( Exception e)” sau „ catch (RuntimeException e) ”.

"Și?"

„Putem trage două concluzii. În primul rând, puteți folosi „catch (Exception e)” pentru a prinde orice excepție. În al doilea rând, ordinea blocurilor de captură contează.

"Aici sunt cateva exemple:"

„Cele ArithmeticExceptioncare se întâmplă după ce împărțim la 0 vor fi prinse în al doilea bloc de captură”.

Cod
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.");
}

„În exemplul de mai jos, ArithmeticExceptionva fi prins în primul bloc de captură, deoarece toate excepțiile moștenesc excepția, adică Exceptionacoperă toate excepțiile.

Cod
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.");
}

„În exemplul de mai jos, ArithmeticExceptionnu va fi prins. Va fi reintrodus la metoda de apelare.”

Cod
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.");
}

"Asta a lămurit puțin lucrurile. Aceste excepții nu sunt subiectul cel mai ușor."

"Numai așa pare. Ele sunt de fapt unul dintre cele mai simple lucruri din Java."

„Nu știu dacă să fiu fericit sau trist din cauza asta...”