Zpracování chyb
Výjimky představují určité situace, ve kterých musí být výpočet přerušen a řízení předáno na místo, kde bude provedeno ošetření výjimky a rozhodnutí o dalším pokračování výpočtu. Starší programovací jazyky pro ošetření chyb během výpočtu obvykle žádnou podporu neměly. U všech funkcí, které mohly objevit chybu, bylo třeba stále testovat různé příznaky a speciální návratové hodnoty, kterými se chyba oznamovala, a v případě, že jsme na testování chyby zapomněli, program běžel dál a na chybu v nejlepším případě nereagoval nebo se zhroutil na zcela jiném místě, kde již bylo obtížné zdroj chyby dohledat.
Jazyk Java, podobně jako např. C++, využívá pro ošetření výjimek metodu strukturované obsluhy. To znamená, že programátor může pro konkrétní úsek programu specifikovat, jakým způsobem se má konkrétní typ výjimky ošetřit. V případě, že výjimka nastane, vyhledá se vždy nejbližší nadřazený blok, ve kterém je výjimka ošetřena.
Výjimky jsou v jazyce Java reprezentovány jako objekty...tyto objekty jsou instancemi tříd odvozených obecně od třídy Throwable se dvěma podtřídami Error a Exception. Každá z těchto podtříd odpovídá jedné skupině výjimek. V první skupině jsou výjimky, jejichž výskyt představuje vážný problém v činnosti aplikace a které by programátor neměl zachycovat. Druhou skupinu tvoří výjimky, jejichž ošetření má smysl - jde například o výjimky jako pokus o otevření neexistujícího souboru, chybný formát čísla apod. Do této skupiny by měly patřit také veškeré výjimky definované uživatelem.
Příkaz try-catch
Zpracování výjimky se vždy vztahuje k bloku programu omezenému příkazem try následovaném jedním nebo více bloky catch popisujícími způsob ošetření jednotlivých výjimek.
Příklad chceme-li ošetřit chyby při práci se souborem (v jazyce Java):
InputStream fs = null; try { fs = new FileInputStream("data.txt"); } catch( FileNotFoundException e ) { System.err.println("Soubor data.txt nenalezen"); System.exit(2); }
Příklad ošetření chyby při chybném parsování čísla (parsujeme například textový řetězec):
class TiskCisel { public static void main(String[] args) { try { int n = Integer.parseInt(args[0]); for(int i = 1; i <= n; i++) System.out.println(i); } catch( NumberFormatException e ) { System.err.println("Chyba: Nespravny format argumentu"); } } }
Potřebujeme-li vyvolat v programu vlastní výjimku, je třeba nejprve vytvořit vhodnou třídu, odvozenou od třídy Exception nebo některé její podtřídy.
class MojeVyjimka extends Exception { MojeVyjimka(String msg) { super(msg); } }
class Vyjimky { static void zpracuj(int x) throws MojeVyjimka { System.out.println("Volani zpracuj " + x); if( x < 0 ) throw new MojeVyjimka("Parametr nesmi byt zaporny"); } public static void main(String args[]) { try { zpracuj(1); zpracuj(-1); } catch( MojeVyjimka e ) { e.printStackTrace(); } } }
Čerpáno ze skript Programovací jazyky Java (Miroslav Beneš)