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š)
