13. V²jimkyV²jimka (exception) je definovßna jako udßlost, kterß nastane b∞hem provßd∞nφ programu a kterß naru╣φ normßlnφ b∞h instrukcφ. V²jimka je vyvolßna nap°φklad p°i chybnΘm otev°enφ souboru, p°i p°ekroΦenφ mezφ pole, p°i aritmetickΘ chyb∞ apod. Mechanismus v²jimek umo╛≥uje tyto chybovΘ stavy zachytit a o╣et°it. K tomu slou╛φ dvojice blok∙ try a catch, jejich╛ syntaxe je nßsledujφcφ:
try { // hlφdan² blok } catch( t°φdaV²jimek1 jmΘnoProm∞nnΘ1 ) { // o╣et°enφ v²jimky } catch( t°φdaV²jimek2 jmΘnoProm∞nnΘ2 ) { // o╣et°enφ v²jimky }
V╣imn∞te si, ╛e dφky v²jimkßm je d∙sledn∞ odd∞len "u╛iteΦn² k≤d" od k≤du, kter² pouze o╣et°uje chyby. V²jimka jednΘ t°φdy m∙╛e b²t navφc vyvolßna v hlφdanΘm bloku na n∞kolika mφstech a k o╣et°enφ postaΦuje jeden blok catch. Ve srovnßnφ s klasick²m zp∙sobem testovßnφ chyb (p°φkazem if) je zachycovßnφ chyb pomocφ v²jimek mnohem p°ehledn∞j╣φ. 13.1. T°φdy v²jimekRodiΦovskou t°φdou v╣ech v²jimek je Throwable (z balφku java.lang), kterß mß standardn∞ dva p°φmΘ potomky:
╚ßst stromu v²jimek t°φdy Exception vypadß takto: Dφky objektovΘ hierarchii v²jimek je mo╛nΘ zachytit vφce t°φd v²jimek v jednom catch bloku - jedna t°φda v²jimek v sob∞ zahrnuje i v╣echny potomky tΘto t°φdy. Proto╛e v╣ak u zßchytn²ch blok∙ zßle╛φ na po°adφ, (2) je mo╛nΘ n∞kterΘ potomky zachytit zvlß╣╗ a ostatnφ nechat bloku zachycujφcφ v²jimky rodiΦovskΘ t°φdy:
Programßtor si samoz°ejm∞ m∙╛e vytvo°it vlastnφ t°φdu v²jimek - staΦφ vytvo°it potomka n∞kterΘ z t°φd v²jimek z Java Core API (nedoporuΦuje se v╣ak jako rodiΦovskou t°φdu pou╛φt p°φmo Throwable). 13.2. Vyvolßnφ v²jimkyV²jimky je mo╛nΘ programov∞ vyvolßvat p°φkazem throw. Jeho syntaxe je:
throw instanceV²jimky ; V²jimka instanceV²jimky musφ b²t instancφ t°φdy Throwable nebo jejφch potomk∙.
13.3. Deklarace v²jimekV╣echny v²jimky, kterΘ mohou v danΘ metod∞ nastat, musφ b²t zachyceny nebo deklarovßny (viz 11.2.2.), jinak p°ekladaΦ ohlßsφ chybu. (3) Druh² p°φpad znamenß, ╛e metoda p°enechßvß o╣et°enφ deklarovan²ch v²jimek volajφcφ metod∞ - dochßzφ k tzv. propagaci v²jimek (viz 13.4.). Volajφcφ metoda op∞t musφ tyto (resp. v╣echny) v²jimky zachytit nebo deklarovat.Deklarace v²jimek se pou╛φvß zejmΘna v p°φpad∞, ╛e na danΘ ·rovni (nap°. p°φmo v knihovn∞) nenφ vhodnΘ provßd∞t o╣et°enφ v²jimky (nenφ mo╛nΘ rozhodnout, jak by m∞lo vypadat o╣et°enφ):
13.4. Propagace v²jimekV²jimka m∙╛e b²t uvnit° metody vyvolßna dv∞ma zp∙soby:Pokud nenφ vyvolanß v²jimka zachycena blokem catch (viz str. 13) v metod∞, kde byla vyvolßna, je p°edßna o ·rove≥ v²╣ (volajφcφ metod∞). Takto se v²jimka rekurzivn∞ p°edßvß dokud nedojde k jejφmu zachycenφ a v krajnφm p°φpad∞ je zachycena runtime systΘmem, kter² zachycuje v╣echny v²jimky (standardn∞ vypφ╣e chybovou zprßvu a ukonΦφ program). Tento mechanismus se naz²vß propagace v²jimek.
13.5. Runtime v²jimkyZvlß╣tnφ postavenφ mezi v²jimkami majφ tzv. runtime v²jimky - instance t°φdy RuntimeException a jejφch potomk∙. Tyto v²jimky nemusφ b²t v metodßch zachycovßny ani deklarovßny.Runtime v²jimky toti╛ reprezentujφ chyby, kterΘ mohou nastat "kdekoliv" v programu. Jednß se nap°φklad o ArrayIndexOutOfBoundsException (p°eteΦenφ indexu pole) nebo ArithmeticException (aritmetickß chyba - celoΦφselnΘ d∞lenφ nulou) apod. O╣et°ovßnφ t∞chto v²jimek by mnohdy znamenalo zbyteΦnou prßci navφc, nebo╗ nap°φklad ve for cyklu lze snadno zajistit, aby index pole meze nep°ekroΦil. Pokud by ArrayIndexOutOfBoundsException nebyla runtime v²jimkou, bylo by ji nutnΘ v ka╛dΘ metod∞, kterß pole pou╛φvß zachytit nebo deklarovat. 13.6. Koncov² blok (finally)Dvojici blok∙ try - catch (viz str. 13) je mo╛nΘ roz╣φ°it o nepovinn² koncov² blok finally nßsledovn∞:
try { // hlφdan² blok } catch( t°φdaV²jimek1 jmΘnoProm∞nnΘ1 ) { // o╣et°enφ v²jimky } finally { // zde uzav°en² k≤d se provede v╛dy } Koncov²m blokem program pokraΦuje po ukonΦenφ hlφdanΘho i zßchytnΘho bloku (tj. a╗ u╛ v²jimka nastane nebo ne). Koncov² blok se vykonß dokonce i v p°φpad∞, ╛e:
|