"Ah. Där är du. Jag har letat efter dig."

"Har något hänt?"

"Nej, men vi studerar fortfarande."

"OK. Jag lyssnar."

"Jag vill berätta ett par saker till om undantag:"

"I Java 7 utökades try-catch -konstruktionen något genom tillägget av flera catch- block. Titta på det här exemplet:"

Java 5
try
{
  …
}
 catch (IOException ex)
{
 logger.log(ex);
 throw ex;
}
 catch (SQLException ex)
{
 logger.log(ex);
 throw ex;
}
Java 7
try
{
  …
}
 catch (IOException | SQLException ex)
{
 logger.log(ex);
 throw ex;
}

"Så nu kan vi skriva flera undantag separerade av OR-operatorer ('|' är binärt ELLER)?"

"Det stämmer. Är det inte bekvämt?"

"Hmm. Men vilken typ av undantagsobjekt kommer inuti fångstblocket?"

"Trots allt har en IOException sina metoder, och en SQLException har sina metoder."

"Undantagstypen kommer att vara deras gemensamma förfadersklass."

"Ah. Med andra ord, det kommer troligen att vara Exeption eller RuntimeException . Varför inte bara skriva catch(Exception e)?"

"Ibland när man hanterar fel individuellt är det bekvämt att gruppera dem, skriva vissa fel till en logg, kasta om andra och hantera andra på annat sätt."

"Med andra ord anses detta schema lösa problemet med dubbletter av fångstblock för att hantera olika fel."

"Ah. Jag förstår. Tack, Ellie."

"Det är inte allt. Jag vill berätta lite mer om äntligen blocket."

"Som du säkert redan vet, exekveras detta block alltid."

"Och när jag säger alltid, menar jag absolut alltid ."

"Till exempel:"

Exempel använder slutligen
try
{
 return 1;
}
 finally
{
 return 0;
}

"Här finns en retur i försöksblocket och en retur i finalblocket . Så den här metodens returvärde blir talet 0."

"The finally block kommer att köras oavsett vad som händer. Och dess retursats skriver över det andra returvärdet med sitt eget värde."

"Jag förstår."

"Men en metod kan antingen returnera ett värde eller skapa ett undantag. "

"Så, om ett värde returneras i ett försöksblock, men det slutliga blocket ger ett undantag , så blir resultatet ett undantag . "

"Vad händer om ett undantag kastas i try -blocket men finally -blocket har en return-sats?"

”Då är det som att metoden fungerat som den ska och värdet i returuppgiften returneras.

Exempel Resultat
try
{
 return 1;
}
 finally
{
 return 0;
}
0
try
{
 return 1;
}
 finally
{
 throw new RuntimeException();
}
RuntimeException
try
{
 throw new RuntimeException();
}
 finally
{
 return 0;
}
0
try
{
 throw new RuntimeException();
}
 finally
{
 throw new IOException();
}
IOException

"Den enda anledningen till att finally-metoden kanske inte exekveras skulle vara programmets omedelbara avslutande genom ett anrop till System.exit();- metoden ."

Exempel
try
{
 System.exit(0);
 return 1;
}
 finally
{
 return 0;
}

"Jag förstår."

"Tänk på att alla dessa ämnen vanligtvis frågas om i intervjuer, så det skulle vara bra för dig att förstå och komma ihåg dem."