"Még néhány érdekes óra. Ó, mennyire szeretek tanítani!"
"Szeretném elmondani, hogyan működnek a többszörös fogási blokkok. Nagyon egyszerű: ha kivételek fordulnak elő a try blokkban, a végrehajtás az első fogási blokkra ugrik."
"Ha a catch blokk zárójelében jelzett típus megegyezik a dobott kivétel típusával, akkor a végrehajtás azon a blokkon belül indul el. Ellenkező esetben a következő fogási blokkra lépünk , ahol ugyanaz az ellenőrzés történik."
"Ha kifogyunk a fogási blokkokból, és a kivételt nem sikerült elkapni, akkor visszadobják, és a jelenlegi módszer abnormálisan leáll."
"Értem. A kivételtípussal egybeeső fogási blokk lesz végrehajtva."
"Igen, igaz. A valóságban azonban ez egy kicsit bonyolultabb. Az osztályok más osztályokat is örökölhetnek. Ha egy tehén osztály örököl egy állat osztályt, akkor a Cow objektumra nem csak egy Cow változó, hanem egy Állat változó is hivatkozhat. "
"És?"
"Mivel minden kivétel örökli az Exceptiont vagy a RuntimeExceptiont (amely az Exceptiont is örökli ), továbbra is elkaphatók a "catch ( e kivétel )" vagy a " catch (RuntimeException e) " használatával."
"És?"
"Két következtetést vonhatunk le. Először is, a "catch (e kivétel)" segítségével bármilyen kivételt elkaphat. Másodszor, a fogási blokkok sorrendje számít. "
"Íme néhány példa:"
"Azt ArithmeticException
, ami azután történik, hogy 0-val osztunk, a második elkapási blokkba kerül."
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.");
}
"Az alábbi példában ArithmeticException
az első fogási blokkban lesz elkapva, mert minden kivétel örökli a kivételt, azaz Exception
minden kivételre kiterjed. "
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.");
}
"Az alábbi példában ArithmeticException
nem lesz elkapva. A rendszer visszadobja a hívási metódust."
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.");
}
"Ez egy kicsit tisztázta a dolgokat. Ezek a kivételek nem a legkönnyebb téma."
"Csak annak tűnik. Valójában a Java egyik legegyszerűbb dolga."
– Nem tudom, hogy ennek örüljek vagy szomorú legyek…
GO TO FULL VERSION