===== 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();
}