13 Rozhraní, výjimky Studijní cíl Tento studijní blok má za cíl pokračovat v základních prvcích jazyka Java. Konkrétně bude věnována pozornost rozhraním a výjimkám. Doba nutná k nastudování 2 2,5 hodiny 13.1 Rozhraní U dědičnosti jsme si uvedli, že je v jazyce Java povolena pouze jednoduchá dědičnost třída může mít vždy pouze jednoho předka. Rozhraní nabízí alternativu vícenásobné dědičnosti, neboť třída kromě jednoho předka může implementovat libovolný počet rozhraní. Pokud deklarujeme proměnnou typu rozhraní, tak daná proměnná může odkazovat na libovolný objekt, který implementuje dané rozhraní. Při deklaraci rozhraní používáme klíčové slovo interface a obsah rozhraní je omezen pouze na konstanty a abstraktní metody (neobsahují žádnou implementaci a mají modifikátor abstract) viz Obrázek 1. Rozhraní je podobné abstraktním třídám, ale účelem je specifikace chování objektů (např. faktura je splatná, zaměstnancům je nutné platit apod.). Obrázek 1: Příklad rozhraní Pokud během deklarace vynecháme modifikátory vedoucí k deklaraci konstant a abstraktních metod, budou tyto modifikátory doplněny automaticky viz Obrázek 2. Obrázek 2: Deklarace rozhraní KST/IZAPR - Základy programování blok 13, strana 1 (5) Michael Bažant
V třídě, která implementuje dané rozhraní, použijeme klíčové slovo implements a v diagramu tříd používáme pro znázornění implementace rozhraní přerušovanou spojnici mezi třídou a rozhraním. U rozhraní potom používáme zápis kurzívou a označení interface viz Obrázek 3. Obrázek 3: Diagram tříd s rozhraním 13.2 Výjimky zachycení a zpracování Programovací jazyk Java obsluhuje chyby a jiné mimořádné události pomocí výjimek. Výjimka je událost, ke které dochází při běhu programu a která narušuje normální průběh instrukcí programu. Výhodou řešení chyb v programech je zejména to, že pomocí výjimek máme možnost oddělit kód obsluhy chyb od běžného kódu a seskupovat a rozlišovat jednotlivé typy chyb. Když dojde k chybě uvnitř metody, vytvoří metoda objekt a předá jej systému runtime. Tento objekt, označovaný jako objekt výjimky, obsahuje informace o chybě včetně jejího typu a stavu programu při výskytu chyby. Vytvoření objektu výjimky a jeho předání systému runtime se označuje jako způsobení výjimky (throw an exception). Poté co metoda způsobí výjimku, pokusí se systém runtime najít nějaký způsob, jak ji zpracovat. Sada možností pro zpracování výjimky má podobu uspořádaného seznamu metod, jejichž volání vedlo k metodě, kde k chybě došlo. Hledání způsobu jak výjimku vyřešit začíná v metodě, kde se chyba vyskytla a pokračuje zásobníkem volání v opačném pořadí k pořadí volání metod. Při nalezení příslušné obsluhy předá systém runtime výjimku této obsluze. Vhodnost obsluhy výjimky se určuje podle toho, zda typ objektu způsobené výjimky odpovídá typu, který obsluha dokáže zpracovat. O zvolené obsluze výjimky se říká, že zachycuje výjimku (catch the exception). Pokud systém runtime prohledá zásobník volání a nenalezne přitom vhodnou obsluhu výjimky, dojde k ukončení systému runtime a programu jako takového. V jazyce Java rozlišujeme tři základní druhy výjimek: Chyby (error) tyto výjimečné stavy mají příčinu mimo aplikaci a aplikace je obvykle nemůže předpokládat a vyřešit (např. porucha hardware, selhání operačního systému apod.). KST/IZAPR - Základy programování blok 13, strana 2 (5) Michael Bažant
Kontrolované výjimky (checked exception) jedná se o výjimečné stavy, které by správně napsaná aplikace měla předpokládat a vyrovnat se s nimi (např. pokus o čtení ze souboru, který neexistuje apod.) Nekontrolované výjimky (unchecked exception), někdy také označované jako výjimky při běhu - tyto výjimky mají příčinu uvnitř aplikace a aplikace je obvykle nemůže předpokládat a vyřešit. Obvykle znamenají programátorskou chybu, například logické chyby nebo nesprávně použité rozhraní API. U těchto výjimek je vhodné odstranit chyby ve zdrojovém kódu, které vedou na výskyt výjimek tohoto typu (např. při pokusu volání metody objektu, přičemž referenční proměnná na žádný objekt neodkazuje výjimka NullPointerException apod.). Hierarchie tříd, do nichž patří jednotlivé výše uvedené typy výjimek je znázorněna na obrázku viz Obrázek 4. Obrázek 4: Hierarchie tříd výjimek Při konstrukci obsluhy výjimky uzavíráme kód, který by mohl způsobit výjimku, do bloku try-catch. V rámci tohoto bloku může být uveden jeden nebo i více příkazů, které mohou způsobit výjimku. Pokud dojde k výskytu výjimky uvnitř bloku try, zpracuje tuto výjimku obsluha, která je k ní přidružena v bloku catch. Bloků catch může být uvedeno i více pro každý typ výjimky zvlášť nebo může být k dispozici i jen jeden blok catch s předkem uvažovaných výjimek viz Obrázek 5. V bloku catch je možné vypsat do konzole bližší informace týkající se výjimky, pro tuto operaci se často používá následující příkaz: System.err.println(); KST/IZAPR - Základy programování blok 13, strana 3 (5) Michael Bažant
Obrázek 5: Blok try a několik bloků catch 13.2.1 Blok finally Blok finally je proveden vždy, když je ukončen blok try a to i v případě, kdy dojde k výskytu výjimky viz Obrázek 6. Obrázek 6: Blok finally 13.3 Výjimky způsobení výjimek Aby bylo možné výjimku zachytit, musí být nejprve výjimka nějakým kódem způsobena. Výjimku může způsobit libovolný kód ať již používaný z API nebo vlastní kód programátora. Výjimky se způsobují pomocí příkazu throw, za kterým následuje instance libovolného potomka třídy Throwable viz Obrázek 7. V tomto obrázku je také použito klíčové slovo throws v deklaraci metody. Toto klíčové slovo není nutné uvádět vždy, je vyžadováno pouze u kontrolovaných výjimek. KST/IZAPR - Základy programování blok 13, strana 4 (5) Michael Bažant
Obrázek 7: Způsobení výjimky Otázky na procvičení 1. Co platí pro kontrolované výjimky? 2. Kdy se používají nekontrolované výjimky? 3. Jak lze vytvořit vlastní třídu, která bude sloužit pro vytváření objektů nekontrolovaných výjimek? 4. Jak dochází k vyvolání výjimky? 5. Pokud je deklarováno, že metoda může vracet více výjimek, jak taková deklarace vypadá? Odkazy a další studijní prameny 1. Java Tutorial - http://docs.oracle.com/javase/tutorial/ KST/IZAPR - Základy programování blok 13, strana 5 (5) Michael Bažant