Použití výjimek při psaní kódu

Přehled informací

Vymezení pojmu výjimka v Javě

Výjimky umožňují v programu ošetřit množství chybových stavů. Java je koncipována tak, aby při tvorbě kódu bylo minimalizováno riziko výskytu chyby. Bohužel se nelze vyvarovat výskytu všech chyb. Chyba se může vytvořit i během provádění programu. Například, když se program dotáže na zadání bodu v AutoCADu a uživatel stornuje akci výběru (tzn. nezadá žádný bod) je vygenerována chyba ComException. Java umožňuje takovéto chyby jednoduchým způsobem dynamicky detekovat a ošetřit. K detekci a ošetření chyb slouží v Javě tzv. správa chyb (exception handling).

Správa chyb je v Javě založena na koncepci předej a chyť (throw - and - catch). Throw - and - catch umožňuje metodě vrátit chybu pomocí příkazu throw nebo ošetřit výskyt chyby pomocí příkazu catch.

Vyvolání výjimky

Na výjimku je možné pohlížet jako na další datový typ Javy, který vrátí volaná metoda. Aby metoda mohla vrátit výjimku, musí metoda vytvořit odvozený objekt z třídy Exception (výjimky) a zavolat na něj metodu throw. Výjimku je poté možné odchytit (zpracovat) pomocí příkazu catch.

Příklad vytvoření objektu výjimky IOException

  void metoda (boolean error)
  {
         // tělo metody
    if (vyskytla_se_chyba)
    throw (new IOException())
  }

Jak je vidět z příkladu, objekt chyby se vytvoří pomocí operátoru new (stejně jako by se vytvářel nový objekt).

Odchycení (zpracování) výjimky

Aby bylo možné ošetřit blok kódu na výskyt chyby, musí se hlídaný úsek kódu umístit do bloku příkazu try. Blok try sděluje Javě, že má provádět příkazy v bloku kódu do té doby než se vygeneruje výjimka. Pokud se výjimka vyskytne, Java opustí blok try a hledá příslušný blok kódu catch, který výjimku odchytne (zpracuje). Správný blok catch se pozná podle uvedeného typu výjimky uvedeného u příkazu catch (viz příklad). Blok catch se provede do konce a běh programu pokračuje. Pokud výjimka není v bloku try vygenerována, je blok catch při provádění programu přeskočen a pokračuje se dalšími příkazy za blokem catch.

Příklad použití příkazů try a catch

  try 
  {
     // blok příkazů, které potřebujeme kontrolovat na výskyt výjimky
  }
  catch (typ_Vyjimky jméno_objektu)
  {
    System.out.println("Byla odchycena výjimka typu typVyjimky");
  }

Poznámka - odchycení výjimek

Při generování výjimky Java hledá odpovídající blok catch. Java pozná správný blok catch podle typu výjimky, který je deklarován v příkazu catch (viz předchozí příklad typ_Vyjimky). Pokud ho nenalezne, předá výjimku o úroveň výše ve volací hierarchii. Dostane-li se výjimka na vrchol hierarchie (hlavní třídy) a není ani zde zpracována, program vypíše chybovou zprávu a ukončí se.

Poznámka - zpracování více výjimek

Java umožňuje efektivně zpracovat více typů výjimek vygenerovaných v jednom bloku try. Pokud potřebujete odchytit váce typů výjimek v jednom bloku try stačí uvést za blok try více bloků catch (viz příklad).

Příklad odchycení dvou výjimek

  try
  {
      // blok příkazů a metod pracujících se soubory
  }
  catch (EOFException e)
  {
    System.out.println("Byla odchycena výjimka typu EOFException");
  }
  catch (FileNotFoundException e)
  {
    System.out.println("Byla odchycena výjimka typu FileNotFoundException");
  }

Alternativou k uvedenému příkladu je odchycení nadřazené třídy uvedených výjimek, kterou je třída IOException. V tomto případě bude kód příkladu vypadat:

  try
  {
     // blok příkazů a metod pracujících se soubory
  }
  catch (IOException e)
  {
    System.out.println("Byla odchycena výjimka typu IOException");
  }

Poznámka - blok try

Blok try může obsahovat libovolný počet příkazů, je však výhodnější do bloku try umisťovat příkazy, které spolu souvisí. Usnadňuje to následné ošetření výjimky v bloku catch.