Hur multifångst fungerar - 1

"Några fler intressanta lektioner. Åh, vad jag älskar att undervisa!"

"Jag skulle vilja berätta om hur flera fångstblock fungerar. Det är väldigt enkelt: när undantag inträffar i ett försöksblock flyttas körningen till det första fångstblocket ."

"Om en typ som anges inom parentesen av catch-blocket matchar typen av det kastade undantaget, startar exekveringen inuti det blocket. Annars går vi till nästa catch- block, där samma kontroll utförs."

"Om vi ​​får slut på fångstblock och undantaget inte har fångats, kommer det att kastas om, och den nuvarande metoden kommer att avslutas på ett onormalt sätt."

"Jag förstår. Fångstblocket som sammanfaller med undantagstypen kommer att vara det som körs."

"Ja, visst. Men i verkligheten är det lite mer komplicerat. Klasser kan ärva andra klasser. Om en Cow-klass ärver en Animal-klass, kan Cow-objektet refereras inte bara av en Cow-variabel, utan också av en Animal-variabel. "

"Och?"

"Eftersom alla undantag ärver Exception eller RuntimeException (som också ärver Exception ), kan de fortfarande fångas med 'catch ( Exception e)' eller ' catch (RuntimeException e) '."

"Och?"

"Vi kan dra två slutsatser. För det första kan du använda 'fångst (Undantag e)' för att fånga vilket undantag som helst. För det andra är ordningen på fångstblocken viktig. "

"Här är några exempel:"

"Det ArithmeticExceptionsom inträffar efter att vi dividerat med 0 kommer att fångas i det andra fångstblocket."

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

"I exemplet nedan ArithmeticExceptionkommer den att fångas i det första catch-blocket, eftersom alla undantag ärver Exception, dvs Exceptiontäcker alla undantag. "

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

"I exemplet nedan, ArithmeticExceptionkommer inte att fångas. Det kommer att kastas om till anropsmetoden."

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

"Det klargjorde lite. Dessa undantag är inte det lättaste ämnet."

"Det verkar bara så. De är faktiskt en av de enklaste sakerna i Java."

"Jag vet inte om jag ska vara glad eller ledsen över det..."