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
výjimky jsou mechanizmem, jak psát robustní, spolehlivé programy odolné proti chybám "okolí" - uživatele, systému...
v Javě jsou výjimky ještě lépe implementovány než
v C++ (navíc klauzule finally
)
není dobré výjimkami "pokrývat" chyby programu samotného - to je hrubé zneužití
Výjimka
(Exception) je objekt třídy
java.lang.Exception
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ý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
finally
Sun Java Tutorial - Lesson: Handling Errors with Exceptions
demo programy z učebnice - Výjimky