===== Výjimky ===== Základní typy výjimek: * ''Error'' * ''RuntimeException'' * ''Exception'' === Error === Závažné chyby, které se mohou vyskytnout ve virtuálním stroji. Neošetřujeme, nereagujeme na ně, protože to nemá smysl (danou chybu stejně nemůžeme opravit). Příklad: ''OutOfMemoryError'' === RuntimeException === Ne tyto výjimky reagovat můžeme, považujeme-li to za vhodné. Jsou to ale výjimky, na které reaguje JVM. Označují se jako **asynchronní výjimy**. Příklad: ''ArithmeticException'', ''NumberFormatException'' Překladač nás nenutí na tyto výjimky reagovat. === Exception === Tzv. kontrolované výjimky. O tyto výjimky se musíme v programu postarat. Označují se také jako **synchronní výjimky**. Nemohou se vyskytnout kdekoliv (jako asynchronní), ale pouze při volání některých metod. Příklad: ''IOException'' Pokud budeme vytvářet vlastní výjimky, budeme je dědit ze třídy ''Exception''. ==== Ošetření výjimek ==== - výjimku neumíme, nebo nechceme zpracovávat a tedy informaci o ní předáme do nadřazené úrovně - výjimku zachytíme a kompletně ošetříme - výjimku zachytíme, částečně zpracujeme a navíc pošleme informaci o výjimce do nadřazené úrovně /* ad 1 */ public int myMethod() throws IOException { ... System.in.read(...); ... } /* ad 2 */ public int myMethod() { ... try { System.in.read(...); } catch (IOException e) { // Zpracovani chyby return -1; } } /* ad 3 */ public int myMethod() throws IOException { ... try { System.in.read(...); } catch (IOException e) { // Castecne zpracovani chyby throw e; } } ==== Nejhorší možná reakce na výjimku ==== Kdo tohle udělá v DU, nebo v semestrálce, toho vyrazím... ... try { ... System.in.read(...); } catch (IOException) { // Zde není žádný kód a to je velmi špatně!!!!! } ... Pokud jse přesvědčeni, že výjimka skutečně nikdy nenastane (jak naivní :-) ) a nechceme plýtvat časem na psaní obsluhy, je možné (a vhodné) řešení toto: catch (IOException e) { e.printStackTree(); }