Obsah
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
Objekty -výjimky- jsou 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:
v rámci metody, kde výjimka vznikla - do bloku catch -> výjimka je v bloku catch tzv. zachycena
výjimka "propadne" do nadřazené (volající) metody, kde je buďto v bloku catch zachycena nebo opět propadne atd.
Výjimka tedy "putuje programem" tak dlouho, než je zachycena
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
Bloku try se říká hlídaný blok, protože výjimky (příslušného hlídaného typu) zde vzniklé jsou zachyceny.
Pokud výjimka nikde v těle numůže vzniknout, překladač to zdetekuje a vypíše:
... Exception XXX is never thrown in YYY ...
Příklad s propouštěnou výjimkou -Otevření souboru s propouštěnou výjimkou
modifikatory návratovýTyp nazevMetody(argumenty) throws TypPropouštěnéVýjimky {
... tělo metody, kde může výjimka vzniknout ...
}
Napravit příčiny vzniku chybového stavu - např. znovu nechat načíst vstup
Poskytnout za chybný vstup náhradu - např. implicitní hodnotu
Operaci neprovést („vzdát“) a sdělit chybu výše tím, že výjimku „propustíme“ z metody
Vždy nějak reagujme! Neignorujme, nepotlačujme, tj.
blok catch nenechávejme prázdný, přinejmenším vypišme e.printStackTrace()
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
V některých blocích try mohou vzniknout výjimky více typů:
pak můžeme bloky catch řetězit, viz přechozí příklad: Příklad komplexní reakce na výjimku
Pokud catch řetězíme, musíme respektovat, že výjimka je zachycena nejbližším příhodným catch
Pozor na řetězení 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!
Všechny objekty výjimek a chybových stavů implementují rozhraní java.lang.Throwable - „vyhoditelný“
Nejčastěji se používají tzv. hlídané výjimky (checked exceptions) - to jsou potomci/instance třídy java.lang.Exception
Tzv. běhové (runtime, nebo též nehlídané, unchecked) výjimky jsou typu/typu potomka --> java.lang.RuntimeException - takové výjimky nemusejí být zachytávány
Vážné chyby JVM (potomci/instance java.lang.Error) - obvykle signalizují těžce napravitelné chyby v JVM - např. Out Of Memory, Stack Overflow..., ale též např. chybu programátora: AssertionError
Typy (=třídy) výjimek si můžeme definovat sami, např. viz - Výjimky ve světě chovatelství
bývá zvykem končit názvy tříd - výjimek - na Exception
Sun Java Tutorial - Lesson: Handling Errors with Exceptions
demo programy z učebnice - Výjimky