Výjimky Obsah Výjimky....................................................................................................................1 Co a k čemu jsou výjimky.....................................................................................................1 Výjimky technicky ..............................................................................................................2 Syntaxe kódu s ošetřením výjimek..........................................................................................2 Syntaxe metody propouštějící výjimku....................................................................................3 Reakce na výjimku..............................................................................................................3 Kaskády výjimek ................................................................................................................3 Kategorizace výjimek a dalších chybových objektů....................................................................4 Vlastní hierarchie výjimek ....................................................................................................4 Klauzule finallyWlKIPRľllA .........................................................................................5 Tlir ťnn- Fil i. L-^a-iL i Odkazy .............................................................................................................................5 Výjimky • Výjimky - proč a jak, co to vlastně je výjimka Syntaxe bloku s ošetřením (zachycením) výjimky • „Únik" výjimky z metody - deklarace metody propouštějící výjimku • Reakce na výjimku • Kaskády výjimek • Kategorizace výjimek (hlídané, běhové, vážné chyby) • Vlastní typy výjimek, objektová hierarchie výjimek • Klauzule finally Co a k čemu jsou výjimky • podobně jako v C/C++, Delphi • výjimky jsou mechanizmem, jak psát robustní, spolehlivé programy odolné proti chybám "okolí" -uživatele, systému... • v Jávě jsou výjimky ještě lépe implementovány než v C++ (navíc klauzule f inallyWlKIPEDlA 1l.rľnvF.L..I.rik. 1 Výjimky [http://cs.wikipedia.org/wiki/Speci%C3%Alln%C3%AD:Search?search=finally]) • není dobré výjimkami "pokrývat" chyby programu samotného - to je hrubé zneužití Výjimky technicky Výjimka (Exception) je objekt třídy java. lang. ExceptionWlĽIPFľllA [http://cs.wikipedia.org/wiki/Speci%C3%Alln%C3%AD:Search?search=java.langException] • Obj ekty -výjimky- j sou vytvářeny (vyvolávány) buďto • automaticky běhovým systémem Javy, nastane-li nějaká běhová chyba, např. dělení nulou, nebo • jsou vytvořeny samotným programem, zdetekuje-li nějaký chybový stav, na nějž je třeba reagovat - např. do metody je předán špatný argument • Vzniklý objekt výjimky je předán buďto: 1. v rámci metody, kde výjimka vznikla - do bloku catch Wit Iři-. 1)1 A H i r rnn1 Pil i. l-aanb i [http://cs.wikipedia.org/wiki/Speci%C3%Alln%C3%AD:Search?search=catch] -> výjimka je v bloku catchWlfCIPFMA T i r rnn1 Pil i. l-aanb i [http://cs.wikipedia.org/wiki/Speci%C3%Alln%C3%AD:Search?search=catch] tzv. zachycena 2. výjimka "propadne" do nadřazené (volající) metody, kde je buďto v bloku catch WlKlľT.TllA [http://cs.wikipedia.org/wiki/Speci%C3%Alln%C3%AD:Search?search=catch] Hir ľni- Fib i. Lf«iLi zachycena nebo opět propadne atd. • Výjimka tedy "putuje programem" tak dlouho, než je zachycena -> pokud není, běh JVM skončí s hlášením o výjimce Syntaxe kódu s ošetřením výjimek Základní syntaxe: try { //zde může vzniknout výjimka } catch (TypVýjimky proměnnáVýjimky) { // zde je výjimka ošetřena // je možné zde přistupovat k proměnnéVýjimky } Příklad - Otevření souboru může vyvolat výjimku [http://www.fi.muni.cz/~tomp/java/ucebnice/javasrc/tomp/ucebnice/vyjimky/OtevreniSouboru.java] 2 Výjimky Bloku tryWHCIPRľJlA [http://cs.wikipedia.org/wiki/Speci%C3%Alln%C3%AD:Search?search=try] Hli r priT Fib i. ľbihi i se říká hlídaný blok, protože výjimky (příslušného hlídaného typu) zde vzniklé jsou zachyceny. Syntaxe metody propouštějící výjimku Pokud výjimka nikde v těle numůže vzniknout, překladač to zdetekuje a vypíše: ... Exception XXX is never thrown in YYY . . .WllilPRniA i"ir ŕni" r 11, i. l-ainh i [http://cs.wikipedia.org/wiki/Speci%C3%Alln%C3%AD:Search?search=... Exception XXX is never thrown in YYY...] Příklad s propouštěnou výjimkou -Otevření souboru s propouštěnou výjimkou [http://www.fi.muni.cz/~tomp/java/ucebnice/javasrc/tomp/ucebnice/vyjimky/OtevreniSouboru2.java] modifikátory návratovýTyp nazevMetody(argumenty) throws TypPropouštěnéVýjimky { ... tělo metody, kde může výjimka vzniknout ... } Reakce na výjimku Jak můžeme reagovat? 1. Napravit příčiny vzniku chybového stavu - např. znovu nechat načíst vstup 2. Poskytnout za chybný vstup náhradu - např. implicitní hodnotu 3. Operaci neprovést („vzdát") a sdělit chybu výše tím, š výjimku „propustíme" z metody Výjimková pravidla: 1. Vždy nějak reagujme! Neignorujme, nepotlačujme, tj. 2. blok catchWlKIPFniA T i r rnn1 Pil i. l-iink i [http://cs.wikipedia.org/wiki/Speci%C3%Alln%C3%AD:Search?search=catch] nenechávejme prázdný, přinejmenším vypišme e.printStackTrace () WlKlPFDlA ľli r p m- rit i. Laaib ■ [http://cs.wikipedia.org/wiki/Speci%C3%Alln%C3%AD:Search?search=e.printStackTrace()] 3. Nelze-li reagovat na místě, propusťme výjimku výše (a popišme to v dokumentaci...) - Příklad komplexní reakce na výjimku [http://www.fi.muni.cz/~tomp/java/ucebnice/javasrc/tomp/ucebnice/vyjimky/VyjimkyZachytZopak ujjava] Kaskády výjimek 3 Výjimky V některých blocích tryWlKIPEMA ílir p m- Fib i. Lnni [http://cs.wikipedia.org/wiki/Speci%C3%Alln%C3%AD:Search?search=try] mohou vzniknout výjimky více typů: pak můžeme bloky catch WlfCIPFTllA I) i r p m- r iL i. LniL ■ [http://cs.wikipedia.org/wiki/Speci%C3%Alln%C3%AD:Search?search=catch] řetězit, viz přechozí příklad: Příklad komplexní reakce na výjimku [http://www.fi.muni.cz/~tomp/java/ucebnice/javasrc/tomp/ucebnice/vyjimky /Výjimky ZachytZopaku jjava] • Pokud catchWlKlPEniA Tip rViT Fík ■. ! ynl ■ [http://cs.wikipedia.org/wiki/Speci%C3%Alln%C3%AD:Search?search=catch] řetězíme, musíme respektovat, že výjimka je zachycena nejbližším příhodným catch WlKIPFfllA TVír p"ni- Pil i. L-jb-iLi [http://cs.wikipedia.org/wiki/Speci%C3%Alln%C3%AD:Search?search=catch] • Pozor na řetězení catch WlĽIPFTllA Trip ppn" FiL i. Iinifai [http://cs.wikipedia.org/wiki/Speci%C3%Alln%C3%AD:Search?search=catch] s výjimkami typů z jedné hierarchie tříd: pak musí být výjimka z podtřídy (tj. speciálnější) uvedena - zachycována - dříve než výjimka obecnější - Takto ne! [http://www.fi.muni.cz/~tomp/java/ucebnice/javasrc/tomp/ucebnice/vyjimky/KaskadaVyjimekSpatn ejava] Kategorizace výjimek a dalších chybových objektů • Všechny objekty výjimek a chybových stavů implementují rozhraní java.langThrowable -„vyhoditelný" • Nejčastěji se používají tzv. hlídané výjimky (checked exceptions) - to jsou potomci/instance třídy ja-va.langException • Tzv. běhové (runtime, nebo též nehlídané, unchecked) výjimky jsou typu/typu potomka --> ja-va.langRuntimeException - takové výjimky nemusejí být zachytávány Vážné chyby JVM (potomci/instance java.langError) - obvykle signalizují těžce napravitelné chyby v JVM - např. Out Of Memory, Stack Overflow..., ale též např. chybu programátora: AssertionError Vlastní hierarchie výjimek • Typy (=třídy) výjimek si můžeme definovat sami, např. viz - Výjimky ve světě chovatelství [http://www.fi.muni.cz/~tomp/java/ucebnice/javasrc/svet.html] • bývá zvykem končit názvy tříd - výjimek - na Exception 4 Výjimky Klauzule f inallyľíS?^ [http://cs.wikipedia.Org/wiki/Speci%C3%A1ln%C3%AD:S earch?search=finally] Klauzule (blok) finally. • Může následovat ihned po bloku tryWlTCIPFMA Tlir kni- tik ■■ L-^a-iL i [http://cs.wikipedia.org/wiki/Speci%C3%Alln%C3%AD:Search?search=try] nebo až po blocích catchWlKlPFniA "Tlir Fn-i- Fib i. L>a-iLi [http://cs.wikipedia.org/wiki/Speci%C3%Alln%C3%AD:Search?search=catch] Slouží k "úklidu v každém případě", tj. • když je výjimka zachycena blokem catchWlKlPFfllA íli r priT r li. ■■ Ľ aan b i [http ://cs. wikipedia. org/wiki/Speci%C3 %A 1 ln%C3 %AD: Search? search=catch] i když j e výj imka propuštěna do volaj ící metody • Používá se typicky pro uvolnění systémových zdrojů - uzavření souborů, soketů... Příklad: Úklid se musí provést v každém případě... [http://www.fi.muni.cz/~tomp/java/ucebnice/javasrc/tomp/ucebnice/vyjimky /VyjimkyFinally Java] Odkazy Sun Java Tutorial - Lesson: Handling Errors with Exceptions [http://javasun.com/docs/books/tutorial/essential/exceptions/index.html] • demo programy z učebnice - Výjimky [http://www.fi.muni.cz/~tomp/java/ucebnice/javasrc/tomp/ucebnice/vyjimky] 5