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

  1. výjimku neumíme, nebo nechceme zpracovávat a tedy informaci o ní předáme do nadřazené úrovně
  2. výjimku zachytíme a kompletně ošetříme
  3. 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();
}

courses/bd6b36pjv/vstupni_znalosti/prace-s_daty/vyjimky.txt · Last modified: 2018/01/17 16:53 (external edit)