Java - Vyjímky (33.díl)

Napsal O webu (») 25. 5. 2008 v kategorii Programování, přečteno: 4389×
obrazky/java_logo.png

Ošetřená výjimka

Výše uvedené informace lze zobecnit. Jestliže je nalezen příslušný blok catch a je do něj vstoupeno, považujeme výjimku za ošetřenou. Pokud by došlo ke vzniku jiného typu výjimky (tj. nebyl by nalezen odpovídající blok catch), nebude výjimka ošetřena. Blok catch by měl obsahovat nějaký výkonný kód, který vykoná akci v závislosti na typu výjimky (např. informuje uživatele, že došlo k chybě). Pozor: nikdy nepoužívejme prázdné bloky catch, v takovém případě by nedošlo k žádné reakci na výjimku.

V případě, kdy bychom chtěli zachytit libovolnou výjimku, museli bychom jako typ ošetřované výjimky použít společného předka, třídu Exception.
catch (Exception e)
{
System.out.prinln(Doslo k nejake vyjimce);
return 0;
}

Následně však není možné zjistit, k jakému typu výjimky došlo, a na základě toho se rozhodnout, jak výjimku ošetřit (různé typy výjimek zpravidla ošetřujeme různě).

Výpis informací o výjimce. Ošetříme -li výjimku konstrukcí try-catch, za běhu programu informace o (ošetřené) výjimce běžným způsobem nezískáme. Je vykonán blok catch, nedojde k zastavení programu a výpisu informace o výjimce. Tyto informace lze získat dodatečně za použití metody printStackTrace().
catch (NumberFormatException e)
{
e.printStackTrace();
}

Získáme tak informace, které lze použít např. při ladění programu. Kombinování výjimek. Doposud jsme v souvislosti s třídou Nacti ošetřovali pouze výjimky typu IOException a ignorovali jsme výjimky vzniklé konverzí načteného řetězce. Jeden blok try může být ošetřen několik bloky catch. Tento postup umožňuje reagovat na více výjimek, jejich počet není v Javě omezen.

Jakmile výjimka svým typem odpovídá typu výjimky uvedené v bloku catch, je tento blok následně proveden.
try
{
//nejaky kod
}
catch (NumberFormatException e)
{
//Osetreni vyjimky
}
catch (IOException e)
{
//Osetreni vyjimky
}


Ošetření výjimky metodou chráněných bloků a její předání výše

Tato metoda je kombinací předchozích dvou postupů. Umožňuje výjimku ošetřit v místě, kde vznikla a následně ji předat výše. Výhodou je fakt, že na výjimku lze reagovat opakovaně na různých úrovních programu.

Vyvolání výjimky. Nejprve se seznámíme s klíčovým slovem throw, které se používá pro vyvolání a následné šíření výjimky. Obsahuje jako parametr odkaz na objekt nesoucí informaci o chybě. Výjimka je šířena dle výše uvedené hierarchie do nadřazených komponent. Neple´me si toto klíčové slovo s klíčovým slovem throws.
throw odkaz;
Lze použít odkaz na již existující objekt nebo vytvořit nový za použití new.
catch (IOException e)
{
throw e; //pouziti existujiciho odkazu
}

Druhá varianta se často pojí s nějakou podmínkou.
if (podminka)
{
throw new IOException; // vytvoreni noveho odkazu
}

Postup šíření výjimky prakticky naznačíme při výpočtu faktoriálu. Třída Faktorial bude obsahovat dvě metody: nacti() realizující načtení hodnoty z formátovaného vstupu a faktorial() pro výpočet faktoriálu. Pokud je na vstupu zadán řetězec obsahující jiný znak než číslo, dojde k vyvolání výjimky IOException, která je následně pomocí příkazu throw předána výše.
public int nacti() throws IOException
{
try
{
byte [] pole=new byte[128];
System.in.read(pole);
String ret=new String(pole);
ret=ret.trim();
int cislo=Double.valueOf(ret).doubleValue();
return cislo;
}
catch (IOException e)
{
System.out.println("Chyba.");
throw e;
}
}

Vlastní výpočet faktoriálu je realizován za použití rekurze takto:
public int faktorial (int n)
{
if (n>1) return n*faktorial(n-1);
else return 1;
}

Výpočet faktoriálu proběhne v metodě main(). Pokud nebyla vyvolána výjimka, je spočtena hodnota faktoriálu v bloku try. V případě, kdy došlo k šíření výjimky příkazem throw, je nalezen odpovídající blok catch, výjimka je opakovaně ošetřena a pomocí metody printStackTrace() jsou uživateli sděleny informace o výjimce. Pokud je zadáno číslo číslo neležící v intervalu <0, 40> je vyvolána výjimka ArithmeticException.
public static void main(String[] args) {
try
{
Faktorial f=new Faktorial();
int c=f.nacti();
if ((c<0)||(c>40)) throw new ArithmeticException;
int fakt=f.faktorial(c);
System.out.println(c+"!="+fakt);
}
catch (IOException e)
{
System.out.println("Chyba pri vstupu dat.");
e. printStackTrace();
}
catch (ArithmeticException e)
{
System.out.println("Hodnota nelezi v intervalu.");
e. printStackTrace();
}
}


Autor: Filip Koval
Štítky: Java
Facebook Twitter Topčlánky.cz Linkuj.cz

Komentáře

Zobrazit: standardní | od aktivních | poslední příspěvky | všechno
Článek ještě nebyl okomentován.


Nový komentář

Téma:
Jméno:
Notif. e-mail *:
Komentář:
  [b] [obr]
Odpovězte prosím číslicemi: Součet čísel nula a dvanáct