===== Výjimky ===== ===== MojeVyjimka.java ===== Z dokumentace ke třídě [[http://java.sun.com/javase/6/docs/api/java/lang/Exception.html|Exception]] zjistíme, že ta poskytuje 4 konstruktory. Každý může být užitečný, takže si je zařídíme také všechny. package vyjimky; public class MojeVyjimka extends Exception { /** * Konstruktor bez zpravy. Muze se zdat k nicemu, nicmene * pokud mate chytre navrzenou hierarchii vyjimek, lze * to obcas zvladnout i beze slov ... :-) * A navic, vyjimky vetsinou potrebujete * selektivne zpracovavat, takze se hierarchie hodi. * Parsovani zprav neni moc dobry napad ... */ public MojeVyjimka (){ super(); } /** * Konstruktor se zpravou * @param message zprava */ public MojeVyjimka (String message){ super(message); } /** * Konstruktor, kteremu muzete dat zpravu i "pricinu". * Pokud zpracovavate vyjimku na vice urovnich, muzete tu * starou "pribalit", * paklize chcete nutne vyhodit novou vyjimku. * @param message zprava * @param cause puvodni vyjimka */ public MojeVyjimka (String message, Throwable cause){ super(message, cause); } /** * Konstruktor jen s pricinou. Viz vyse. * @see #MojeVyjimka(java.lang.String, java.lang.Throwable) * @param cause puvodni vyjimka */ public MojeVyjimka (Throwable cause){ super(cause); } } ===== Main.java ===== package vyjimky; public class Main { public static void c(){ System.out.println("c"); /* * hmm, deleni nulou, jak to asi dopadne ... * k vypisu "c-konec" se nedostaneme */ int a = 1/0; System.out.println("c-konec"); } /** * metoda b * @throws MojeVyjimka je potomkem Exception, * takze ji v metode musime deklarovat */ public static void b() throws MojeVyjimka{ System.out.println("b"); try{ c(); } catch (ArithmeticException ex){ /* * vyjimku chytime, vypiseme, a posleme dal */ System.out.println("hlupaku: "+ ex.getMessage()); throw ex; } finally { /* * Kod v sekci finally se provede v kazdem pripade: * 1. sekce try skonci normalne * 2. ze sekce try se utece pomoci return * 3. ze sekce se vyskoci vyjimkou * 4. ze sekce se vyskoci vyjimkou a v catch ji odchytime */ System.out.println("b-konec"); } } public static void a() throws MojeVyjimka{ System.out.println("a"); try { b(); } catch (ArithmeticException ex){ //throw new MojeVyjimka(); //throw new MojeVyjimka(ex); throw new MojeVyjimka("Zachycena vyjimka", ex); } /* * tento kod se neprovede v pripade, ze se v sekci * catch zase vyhazuje vyjimka */ System.out.println("a-konec"); } public static void main (String [] args) throws MojeVyjimka{ try{ a(); } /* * Vyjimky se musi zachytavat od tech v hierarchii * nejnize. Obracene by nam to ted ani nedovolil * prekladac. */ catch (MojeVyjimka ex){ System.out.println("nastala moje chyba: "+ex.getMessage()); /* * Poslali jsme pribalenou jinou vyjimku, takze * stacktrace bude celkem pekny. * Pokud bychom ji nepribalili, tak ztratime informaci o tom * kde skutecne vyjimka vznikla. * Misto toho budeme vedet pouze, kde jsme vyhodili tu druhou. * Abychom se opravdu dozvedeli puvodni pricinu vyjimky, * je dobre: * 1. ji bud jen preposilat (throw ex) * 2. pribalovat do konstruktoru te nove, pokud nutne potrebujeme * nekde zachytavat a posilat jinou. */ ex.printStackTrace(); } catch (ArithmeticException ex){ System.out.println("nastala aritmeticka chyba: "+ex.getMessage()); } catch (Exception ex){ System.out.println("nastala obecna chyba: "+ex.getMessage()); } System.out.println("konec"); } }