Výnimky

Podobné dokumenty
enum

Identity Lifecycle Management

Tue Oct 3 22:05:51 CEST Začiatky s jazykom C 2.1 Štruktúra programu Štruktúra programu by sa dala jednoducho popísať nasledovnými časťami, kto

História

Identity Lifecycle Management

PowerPoint Presentation

Objektovo orientované programovanie

midterm2014_1

Funkcionálne programovanie Cvičenie 9 Funkcionálne programovanie v Jave Sergej Chodarev 22. november 2017 Technická Univerzita v Košiciach

Úroveň strojového kódu procesor Intel Pentium Pamäťový operand Adresovanie pamäte Priama nepriama a indexovaná adresa Práca s jednorozmerným poľom Pra

DediĊnosť

Identity Lifecycle Management

PowerPoint Presentation

Microsoft PowerPoint - OOP_prednaska_10.pptx

User:Andrej Sedlacek

Snímka 1

Identity Lifecycle Management

PowerPoint Presentation

Žiadosť o licenčnú zmluvu na podujatie Na adrese v sekcii hlavného menu kliknete na položku Používatelia. Zobrazí sa blokové menu,

RE Windows

Hardwarové prerušenie Nasledujúci kód ukazuje inštaláciu obsluhy časovača vrátane jeho inicializácie // inicializace časovače, přerušení každou milise

Matematický model činnosti sekvenčného obvodu 7 MATEMATICKÝ MODEL ČINNOSTI SEKVENČNÉHO OBVODU Konečný automat predstavuje matematický model sekvenčnéh

Konkurentné programovanie

midterm2019

FAQ

PowerPoint Presentation

PowerPoint Presentation

Vzorové riešenia úlohy 4.1 Bodovanie Úvod do TI 2010 Dôvod prečo veľa z Vás malo málo bodov bolo to, že ste sa nepokúsili svoje tvrdenia dokázať, prič

Úvod do mobilného operačného systému ANDROID

Microsoft PowerPoint - SLIDES_02DTD.ppt

Microsoft PowerPoint - Prog_p08.ppt

Návod na obsluhu CompactIO 1

MO_pred1

Matej Kendera - PDF, word, lucene, java

(Microsoft Word - Tuzemsk\341 a zahrani\350n\341 jazda \232tandardn\341 jazda.docx)

INTERNET BANKING Ako zrealizovať hromadný prevod VŠETKO, ČO JE MOŽNÉ with.vub.sk, Bank of

Snímka 1

Používateľská príručka POUŽÍVATEĽSKÁ PRÍRUČKA Generátor XML dávok pre Informačný systém kontrolných známok z MS Excel šablóny Dátum: Verzia

6

IT NEWS

Konkurentné programovanie

NSK Karta PDF

2

Princípy tvorby softvéru Programovacie paradigmy

Riesenie_zasielkovna

Centrum vedecko-technických informácií, Odbor pre hodnotenie vedy, Oddelenie pre hodnotenie publikačnej činnosti Vyhľadávanie a práca so záznamami - C

SK_mTransfer_Okamzita_notifikacia_ indd

0022-vub-mobilne-tokeny-200x200-v03.indd

Architektúra a návrh Zdôvodnenie navrhnutej architektúry Systém si architektonicky môžeme rozdeliť na viacero vrstiev. Najpodstatnejšie je oddelenie z

SK01-KA O1 Analýza potrieb Zhrnutie BCIME tím Vyhlásenie: "Podpora Európskej komisie pre výrobu tejto publikácie nepredstavuje súhlas

Manuál pre nastavenie tlače z VRP Bluetooth, USB tlačiarne Bluetooth, USB tlačiarne Manuál pre nastavenie tlače -1-

MO_TČOZ_TLY_2018_2019

GEODETICKÝ A KARTOGRAFICKÝ ÚSTAV BRATISLAVA Chlumeckého 4, Bratislava II Obsah 1. Export údajov ZBGIS do CAD formá

Používateľská príručka elektronických služieb pre žiadateľov o štatistické informácie október 2016

NÁVRH UČEBNÝCH OSNOV PRE 1

STRUČNÝ NÁVOD KU IP-COACHU

RIMI-NABDA, s.r.o. Zabezpečovací systém SecoLink RIMI NABDA, spol. s r.o. ul. Z. Kodálya 1421/ Sládkovičovo IČO: , DIČ:SK O

INTERNET BANKING Práca s tokenom VŠETKO, ČO JE MOŽNÉ with.vub.sk, Bank of

Kamera Sieťová klenbová kamera Rýchla používateľská príručka---po slovensky Táto rýchla príručka sa vzťahuje na: DS-2CD4112F-(I), DS-2CD4124F-(I), DS-

Photo Album

Microsoft PowerPoint - SK.ppt

Podvojné účtovníctvo, fakturácia a sklad ekasa: štandardný predaj priamo z programu Pri predaji s priamym napojením na softvér je potrebné mať online

2.5. Dotyčnica krivky, dotykový kužeľ. Nech f je krivka a nech P V (f) (t.j. m P (f) 1). Ak m P (f) = r a l je taká priamka, že I P (f, l) > r, potom

VSDC Free Video Editor stručný návod na používanie Link na sťahovanie softvéru: K prog

Microsoft PowerPoint - CONNECT_R&A_76_sk

Používateľská príručka pre webovú aplikáciu ON!Track Príručka pre webovú aplikáciu, verzia 1.1

Navigácia po úvodnej stránke elektronickej schránky Dátum zverejnenia: Verzia: 10 Dátum aktualizácie: Navigácia po úvodnej st

PowerPoint Presentation

iot business hub whitepaper isdd_em_New.pdf

Rozdeľovanie IT zákaziek UX Peter Kulich

Prístup a Nastavenie pre KOMPAKT HOSTING

Praktické paralelné programovanie v jazykoch C# 4.0 a C++

Balíčkovanie FreeSWITCH-u pre Debian Autor: Zdenko Holeša, InžProjekt 1, KIS FRI ŽU Predkompilované balíčky Predkompilované balíčky existujú pre Debia

Microsoft Word - prirucka_katedry_nova

eKasa

Úrad pre dohľad nad zdravotnou starostlivosťou Žellova 2, Bratislava Dátové rozhranie pre externý subjekt FR SR Strana 1 z 11 Dátové rozhranie

Snímka 1

2

Snímka 1

Snímka 1

Operačné systémy Prednáška č. 2 Windows 95 Windows 95 má povesť ľahko ovládateľného systému pre užívateľov a ťažkého systému pre programátorov. Začiat

Sprievodný list SofComs.r.o., Priemyselná 1, Liptovský Mikuláš Program basic.sk Verzia ( ) Dátum Autor Ing. J. Malíček

Microsoft Word - Argumentation_presentation.doc

Microsoft Word - Priloha_1.docx

Agenda záverečnej práce pedagóg Celá agenda týkajúca sa záverečnej práce je dostupná v obrazovke Záverečná práca (menu Agenda pedagóga -> Záverečné pr

Detail správy a súvisiace prvky Dátum zverejnenia: Verzia: 5 Dátum aktualizácie: Detail správy a súvisiace prvky UPOZORNENIE

Finančné riaditeľstvo Slovenskej republiky 9/ORP/2019/IM Stiahnutie identifikačných a autentifikačných údajov pri ORP - rola Administrátor/Technik Inf

KRITÉRIÁ PRE VÝBER PROJEKTOV - POSUDZOVACIE KRITÉRIÁ pre posúdenie projektových zámerov v rámci Integrovaného regionálneho operačného programu priorit

Slide 1

Seminar-ISO Prihlaska

ECDL Syllabus V50 SK-V01

Finančné riaditeľstvo Slovenskej republiky Testovacie scenáre

Algoritmizácia a programovanie - Príkazy

O babirusách

Vždy pripravení pomôcť Zaregistrujte svoj produkt a získajte podporu na SPA2100 Príručka užívateľa

KATALÓG SLUŽIEB 2019 DOPRAVA PRIEMYSEL BEZPEC NOS BEZPE NOST LOGISTIKA PODUJATIA Technopol International, a. s., Kutlíkova 17, Bratislava, tel:

dFlex Nitra spol. s r.o.

Microsoft Word - Novinky_2012_2.doc

Informačné technológie

Seminar-ISO Prihlaska

Prepis:

Objektovo orientované programovanie (výnimky) 7. prednáška Vladislav Novák FEI STU v Bratislave 28.10.2014 (oprava 4.11 na str. 9)

Obsah Výnimky (exceptions)... 1 Zachytenie a spracovanie výnimiek... 2 Určenie výnimky spôsobenej metódou... 6 Trieda Throwable a jej podtriedy... 7 Zachytiť alebo určiť požiadavku (catch or specify requirement)... 8 Tri druhy výnimiek... 8 Ako spôsobiť (vyhodiť) výnimku... 9 Zreťazené výnimky... 12 Try-with-resource a rozhranie AutoCloseable... 12 Použitie kontrolovaných a nekontrolovaných výnimiek... 14 Výhoda použitia výnimiek. 14

Výnimky (exceptions) Výnimka (exception) je udalosť, ktorá narušuje normálny priebeh poradia vykonávaných inštrukcii programu. Používa sa pre obsluhu chýb. Termín výnimka je skrátenie pre výnimočná udalosť (exceptional event). Nesúvisí však s koncepciou udalosťami riadených programov. hlavný kód programu............... chyba............ obsluha výnimky............ Pri vzniku chyby je vytvorený objekt výnimky. Ten je predaný do runtime systému. Objekt výnimky obsahuje informácie o chybe. Vytvorenie objektu výnimky a jeho predanie runtime systému sa označuje ako spôsobenie výnimky alebo vyhodenie výnimky (throwing an exception). main volanie metódy metóda s obsluhou výnimky volanie metódy metóda bez obsluhy výnimky volanie metódy metóda kde došlo ku chybe (bez obsluhy výminky) chyba 1

Po vyhodení výnimky runtime systém hľadá najbližší blok kódu určený pre spracovanie výnimky. Tento blok kódu sa nazýva obsluha výnimky (exception handler). Každá obsluha je určená na spracovanie určitého typu výnimky typ výnimky je daný typom objektu výnimky. Hovoríme, že obsluha výnimky zachytáva výnimku (catch exception). Zvyšok bloku kódu kde vznikla chyba sa vynechá. Ak chyba vznikla v metóde ktorá neobsahuje príslušnú obsluhu výnimky, tak sa obsluha hľadá v niektorej aktuálne nadradenej metóde (z hľadiska volania metód). Na to sa využíva zásobník volaní (call stack). Zachytenie a spracovanie výnimiek //kód kde môže vzniknúť chyba catch(typvynimky1 objektvynimky){ // obsluha výnimky typu (alebo podtypu) TypVynimky1 catch(typvynimky2 objektvynimky){ // obsluha výnimky typu (alebo podtypu) TypVynimky2 finally{ //kód ktorý sa vykonaná vždy po bloku try (aj v prípade, že bloky catch nezachytia výminku) Blok try uzaviera časť kódu, kde môžu vzniknúť výnimky ktoré chceme zachytávať. Za blokom try musí nasledovať blok catch (prípadne viac blokov catch), alebo blok finally, alebo obidva druhy blokov s ktorých musia byť prvé bloky catch. Bloky catch ku bloku try môže byť pridružený jeden, alebo viac blokov catch, ktoré slúžia na obsluhu výnimiek vyhodených z bloku try. Medzi koncom bloku try a začiatkom bloku catch nesmie byť žiadny kód. Každý blok catch slúži na obsluhu určitého typu výnimky. Typ výnimky je daný triedou. Trieda je priamym, alebo nepriamym potomkom triedy Throwable. Ak sa v niektorej časti bloku try vyhodí výnimka, tak sa nepokračuje ďalej vo vykonávaní príkazov bloku try, ale začne sa vykonávať obsluha výnimky v bloku catch. Zvyšok bloku try sa už nevykoná. Po obsluhe výnimky sa pokračuje za blokmi catch. Blok finally Slúži na upratanie/čistenie. Príkazy v bloku finally sa vykonajú vždy po ukončení bloku try, bez ohľadu na to či bola vyhodená výnimka, alebo nie. A to aj v prípade ak sa v bloku try vykonal príkaz return, continue, alebo break. Umiestnenie upratovacieho kódu do bloku finally patrí medzi dobré programátorské postupy. Výhodou bloku finally je to, že sa vykoná aj v prípade, ak je vyhodená výnimka obslúžená v bloku catch umiestenom v inej metóde (nadradenej v zásobníku volaní). 2

Postup vykonávanie blokov: 1. blok try (dokonca, alebo po vyhodenie výnimky) 2. blok cath vykoná sa ak v bloku try dôjde k vyhodeniu výnimky a typ objektu výnimky je rovnaký ako typ uvedený v bloku catch, alebo je podtypom typu uvedeného v bloku catch. 3. blok finally (vykoná sa vždy, ak je uvedený) 4. pokračuje sa vykonávaním kódu uvedenom za týmito blokmi príklad: System.out.println("zaciatok programu"); try{ System.out.println("blok try (zaciatok)"); //String retazec = "male pismena"; String retazec = null; System.out.println(retazec.toUpperCase());//vyhodí výnimku System.out.println("blok try (dokonceny)"); catch(nullpointerexception objektvynimky) { System.out.println("blok catch"); finally{ System.out.println("blok finally"); System.out.println("dalsi kod programu"); výstup: zaciatok programu blok try (zaciatok) blok catch blok finally dalsi kod programu príklad (viac blokov catch, použitie objektu výnimky v obsluhe výnimky): System.out.println("zaciatok programu"); System.out.println("blok try (zaciatok)"); String retazec = "male pismena"; //retazec = null; System.out.println(retazec.toUpperCase()); //teraz OK System.out.println(retazec.charAt(50)); //vyhodí výnimku System.out.println("blok try (dokonceny)"); catch (NullPointerException objektvynimky) { System.out.println("blok catch (nulovy pointer)"); System.out.println("sprava: " + objektvynimky.getmessage()); catch (IndexOutOfBoundsException objektvynimky) { System.out.println("blok catch (index mimo rozsahu)"); System.out.println("sprava: " + objektvynimky.getmessage()); finally { System.out.println("blok finally"); System.out.println("dalsi kod programu"); 3

výstup: zaciatok programu blok try (zaciatok) MALE PISMENA blok catch (index mimo rozsahu) sprava: String index out of range: 50 blok finally dalsi kod programu Ak je uvedených viacero blokov catch za sebou, obsluha výnimky sa hľadá v takom poradí v akom sú bloky catch uvedené. príklad (vnorenie try-catch-finally v inom try, obsluha výnimky vyššie): public static void main(string[] args) { System.out.println("blok try - vonkajsi (zaciatok)"); String retazec = "male pismena"; retazec = null; pracujsretazcom(retazec); System.out.println("blok try - vonkajsi (dokonceny)"); catch (NullPointerException objektvynimky) { System.out.println("blok catch - vonkajsi (nulovy pointer)"); finally { System.out.println("blok finally - vonkajsi"); System.out.println("dalsi kod programu"); public static void pracujsretazcom(string retazec) { try{ System.out.println("blok try - vnutorny (zaciatok)"); System.out.println(retazec.charAt(50));//NullPointerException System.out.println("blok try - vnutorny (dokonceny)"); catch (IndexOutOfBoundsException objektvynimky) { System.out.println("blok catch - vnutorny (index mimo rozsahu)"); finally { System.out.println("blok finally - vnutorny"); System.out.println("koniec metódy"); výstup: blok try - vonkajsi (zaciatok) blok try - vnutorny (zaciatok) blok finally - vnutorny blok catch - vonkajsi (nulovy pointer) blok finally vonkajsi dalsi kod programu 4

príklad (blok finally a príkaz return): public static void main(string[] args) { System.out.println("zaciatok programu"); try{ System.out.println("blok try (zaciatok)"); String retazec = "male pismena"; //retazec = null; System.out.println(retazec.toUpperCase());//nevyhodí výnimku System.out.println("blok try (dokonceny)"); return; catch(nullpointerexception objektvynimky) { System.out.println("blok catch(nullpointerexception)"); finally{ System.out.println("blok final - tento kod sa vykona"); System.out.println("tento kod sa uz nevykona"); výstup: zaciatok programu blok try (zaciatok) MALE PISMENA blok try (dokonceny) blok final - tento kod sa vykona Blok finally sa vykonal aj keď bol pre ním uvedený return. príklad (bez bloku catch): try{ System.out.println("blok try (zaciatok)"); String retazec = null; System.out.println(retazec.toUpperCase());//vyhodí výnimku System.out.println("blok try (koniec)"); finally { System.out.println("blok finally"); Po vzniku výnimky sa vykoná blok finally a obsluha výnimky sa hľadá v nadradených blokoch try-catch, ktoré sú buď v tej istej metóde, alebo v nadradenej metóde z hľadiska volania metód. 5

Určenie výnimky spôsobenej metódou Ako sme si ukázali, metódy nemusia obsluhovať všetky výnimky, ktoré v nich môžu vzniknúť. V prípade že v metóde môže vzniknúť chyba (následkom nej výnimka), ale používateľa metódy chceme iba informovať o chybe (vyhodením výnimky z metódy) a nechať ho aby rozhodol ako spracovať chybu (teda výnimku) v ním definovanom bloku catch, môžeme použiť určenie výnimky spôsobenej metódou. Vtedy pomocou kľúčového slova thorws vymenujeme zoznam výnimiek, ktoré môže metóda vyhodiť. Nie všetky typy výnimiek musia byť takto určené. Ako bude uvedené neskôr, povinné je určovať iba kontrolované výnimky. Príklad: //zoznam výnimiek informuje používateľa metódy, že metóda môže vyhodiť //výnimky typu NullPointerException a IndexOutOfBoundsException public static void pracujsretazcom(string retazec) throws NullPointerException, IndexOutOfBoundsException { System.out.println("metoda - zaciatok"); System.out.println(retazec.charAt(50)); //NullPointerException System.out.println("metoda - dokoncena"); public static void main(string[] args) { System.out.println("blok try (zaciatok)"); String retazec = "male pismena"; retazec = null; pracujsretazcom(retazec); System.out.println("blok try (dokonceny)"); catch (NullPointerException objektvynimky) { System.out.println("blok catch (NullPointerException)"); catch (IndexOutOfBoundsException objektvynimky) { System.out.println("blok catch (IndexOutOfBoundsException)"); //blok final nie je povinný Tento príklad nie je celkom dobrý pretože: Výnimky typu NullPointerException a IndexOutOfBoundsException sú nekontrolované výnimky, preto ich v tomto príklade nie je nutné uvádzať za kľúčovým slovom throws. výstup: blok try (zaciatok) metoda - zaciatok blok catch (NullPointerException) 6

Trieda Throwable a jej podtriedy Typ výnimky je daný triedou objektu výnimky. Všetky triedy výnimiek sú priamymi, alebo nepriamymi potomkami triedy Throwable (java.lang.throwable). Object Throwable Error Exception RuntimeException Trieda Error Ak dôjde k chybe dynamického prepojenia, alebo inej závažnej chybe modulu JVM, spôsobí modul výnimku typu Error. Jednoduché programy bežne nezachytávajú, ani nespôsobujú výnimky typu Error. Trieda Exception Väčšina programov vyvoláva a zachytáva objekty odvodené od triedy Exception. Objekt typu Exception oznamuje, že došlo k problému, ale nejde o závažný systémový problém. Príkady: - IllegalAccessException nepodarilo sa nájsť konkrétnu metódu - NegativeArraySizeException pokus o vytvorenie poľa zo zápornou veľkosťou Trieda RuntimeException Je vyhradená pre výnimky oznamujúce nesprávne použitie rozhrania API. Príklady: - NullPointerException nastáva pri pokuse o prístup k objektu pomocou referencie s hodnotou null - IndexOutOfBoundsException index mimo rozsahu 7

Zachytiť alebo určiť požiadavku (catch or specify requirement) Kód ktorý by mohol spôsobiť výnimku, je niekedy nutné uzavrieť jedným z dvoch spôsobov: - uzavrieť do bloku try, za ktorým nasleduje obsluha výnimky - uzavrieť do metódy, ktorá uvádza (pomocou throws), že môže spôsobiť výnimku Toto pravidlo sa nazýva zachytiť, alebo určiť. Niektoré výnimky musia splňovať toto pravidlo, iné ho splňovať nemusia. Tri druhy výnimiek 1) kontrolovaná výnimka (checked exception) výnimočné stavy, s ktorými by sa mala aplikácia vedieť vyrovnať (napr. práca s I/O) Kontrolované výnimky podliehajú požiadavke zachytiť, alebo určiť. Medzi kontrolované výnimky patria všetky výnimky okrem tých, ktoré sú inštanciami tried Error, RuntimeException, alebo ich podtriedami. 2) chyba (error) tieto výnimočné stavy majú obvykle príčinu mimo aplikácie. Aplikácia ich obvykle nemôže predpokladať a vyriešiť. Napr. aplikácia úspešne otvorí súbor na čítanie, ale nemôže ho čítať kvôli poruche hárdveru, alebo poruche systému. Programátor môže, ale nemusí takúto výnimku zachytávať. Na tento druh výnimiek sa požiadavka zachytiť, alebo určiť nevzťahuje. Tieto výnimky sú označené triedou Error a jej podtriedami. 3) výnimka za behu (runtime exception) tieto výnimočné stavy majú príčinu v aplikácii a aplikácia ich obvykle nemôže predpokladať a vyriešiť. Obvykle znamenajú programátorskú chybu. Napríklad logické chyby, alebo nesprávne použitie rozhrania API. Napríklad ak je na niektorom mieste programu očakávaná nenulová referencia na objekt, ale pri vykonávaní má táto referencia hodnotu null. Aplikácia môže zachytiť túto výnimku, ale lepšie je odstrániť chybu v kóde programu, kvôli ktorej k výnimke došlo. Tieto výnimky nepodliehajú požiadavke zachytiť, alebo určiť. Výnimky sú označené triedou RuntimeException, alebo jej podtriedami. Nekontrolované výnimky (unchecked exception) spoločné označenie pre tieto druhy výnimiek: chyba a výnimka za behu. 8

Ako spôsobiť (vyhodiť) výnimku Výnimky sa vyhadzujú príkazom throw. Príkaz throw vyžaduje jediný argument: objekt ktorý možno vyhodiť. Tieto objekty sú inštanciami ľubovoľnej podtriedy triedy Throwable. Príklad (spôsobenia výnimky): throw objektvynimky; Príklad (vytvorenie vlastnej výnimky, spôsobenie výnimky): Definujeme triedu reprezentujúcu zásobník a výnimky reprezentujúce chyby pri práci so zásobníkom. Väčšinou budeme vytvárať kontrolované výnimky, teda dediť od triedy Exception. Názov typu výnimky sa v tomto prípade končí "Exception" (konvencia). Trieda Exception definuje správu obsahujúcu textový reťazec s popisom chyby. Túto správu môžeme nastaviť napr. pomocou parametra konštruktora a získať volaním metódy getmessage(). //Pre všetky výnimky definujeme spoločnú nadtriedu, aby sme mohli spoločne narábať s výnimkami //zásobníka. public abstract class AbstractStackException extends Exception { public AbstractStackException(String message) { super(message); //správu s popisom chyby predáme konštruktoru nadtriedy //Chybne zadaná kapacita zásobníka (pri vytváraní) public class CapacityStackException extends AbstractStackException { public CapacityStackException(int capacity) { super("chybne udana kapacita (" + capacity + ")"); //Chyba pri pokuse o výber hodnoty z prázdneho zásobníka public class EmptyStackException extends AbstractStackException { public EmptyStackException() { super("prazdny zasobnik"); //Chyba pri vkladaní hodnoty do plného zásobníka public class FullStackException extends AbstractStackException { public FullStackException(double value, int capacity) { super("zasobnik plny (hodnota = " + value + ", kapacita = " + capacity + ")"); 9

public class Stack { private double[] data; private int counter; public Stack(int capacity) throws CapacityStackException { if( capacity <= 0 ) { throw new CapacityStackException(capacity); data = new double[capacity]; counter = 0; public double pop() throws EmptyStackException { if( counter == 0 ) { throw new EmptyStackException(); counter --; return data[counter]; public void push(double newdata)throws FullStackException { if( counter == data.length ) { throw new FullStackException(newData, data.length); data[counter] = newdata; counter ++; príklad obsluhy výnimiek (každá výnimka obslúžená zvlášť): public static void main(string[] args) { Stack stack1 = new Stack(2); Stack stack2 = new Stack(-10); //výnimka stack1.push(1); stack1.push(2); stack1.push(3); //výnimka stack1.pop(); stack1.pop(); stack1.pop(); //výnimka catch (CapacityStackException exception) { System.err.println(exception.getMessage()); catch (EmptyStackException exception) { System.err.println(exception.getMessage()); catch (FullStackException exception) { System.err.println(exception.getMessage()); 10

príklad obsluhy výnimiek - blok catch pre typ AbstractStackException zachytí všetky výnimky typu AbstractStackException alebo výnimky podtried triedy AbstractStackException - výnimky typu FullStackException budu ale zachytené v prvom bloku catch, pretože je umiestnený pred blokom zachytávajúcim typ AbstractStackException. Výnimky typu FullStackException už nebudú obslúžené v druhom bloku public static void main(string[] args) { Stack stack1 = new Stack(2); Stack stack2 = new Stack(-10); //výnimka stack1.push(1); stack1.push(2); stack1.push(3); //výnimka stack1.pop(); stack1.pop(); stack1.pop(); //výnimka catch (FullStackException exception) { //zachytenie výnimky typu FullStackException System.err.println("full: " + exception.getmessage()); catch (AbstractStackException exception ) { //zachytenie výnimiek typu // - CapacityStackException // - EmptyStackException System.err.println("vseobecne: " + exception.getmessage()); príklad obsluhy rôznych typov výnimiek v jednom bloku catch (využitie operátora ) public static void main(string[] args) { Stack stack1 = new Stack(2); Stack stack2 = new Stack(-10); //výnimka stack1.push(1); stack1.push(2); stack1.push(3); //výnimka stack1.pop(); stack1.pop(); stack1.pop(); //výnimka catch (CapacityStackException exception) { //zachytenie CapacityStackException System.err.println("vytvaranie zasobnika: " + exception.getmessage()); catch (EmptyStackException FullStackException exception) { //zachytenie EmptyStackException alebo FullStackException System.err.println("praca so zasobnikom: " + exception.getmessage()); Ak catch blok zachytáva viac typov výnimiek, jeho parameter je implicitne final. 11

Zreťazené výnimky Aplikácie často reagujú na výnimku tak, že spôsobia ďalšiu výnimku (iného typu) príklad: //... catch (LowLevelException exeption) { //pretransformuje nízkoúrovňovú chybu na vysokoúrovňovú throw new HighLevelException( detailna sprava, exception); Trieda Throwable obsahuje konštruktory a metódy podporujúce zreťazené výnimky: Throwable(String, Throwable) Throwable(Throwable) Throwable getcause() Throwable initcause(throwable) Argument konštruktorov a metódy initcause() (typu Throwable) predstavuje výnimku, ktorá je príčinou aktuálnej výnimky. Metóda getcause() vráti výnimku, ktorá spôsobila aktuálnu výnimku. Try-with-resource a rozhranie AutoCloseable Do bloku finally sa umiestňuje kód, ktorý treba vykonať bez ohľadu na to, či výnimka vznikla, alebo nie. Častým príkladom je práca so systémovými zdrojmi (napr. súbormi), ktorá je potenciálnym zdrojom výnimiek. Kód pracujúci so systémovými zdrojmi zvykne byť umiestnený v bloku try, uzatvorenie systémových zdrojov (napr. súborov) v bloku finally. Pre zjednodušenie práce existuje v jave ďalšia možnosť definovania bloku try (try-withresources), vhodná pre prácu so systémovými zdrojmi, ktoré implementujú rozhranie AutoCloseable. Toto rozhranie definuje metódu close(), ktorá sa automaticky vykoná pri ukončení bloku try. Príklad (čítanie znakov zo súboru a ich posielanie cez sieť) CitacSuboru.java public class CitacSuboru implements AutoCloseable { public CitacSuboru(String subor) throws FileNotFoundException{ //otvorenie súboru public char citajdalsi() throws IOException { //prečítanie a vrátenie znaku zo súboru @Override public void close() throws IOException { //zatvorenie súboru 12

SietovyVysielac.java public class SietovyVysielac implements AutoCloseable{ public SietovyVysielac(String sietovaadresa) throws IOException{ //otvorenie komunikácie public void posli(char znak) throws IOException { //poslanie znaku @Override public void close() throws IOException { //uzatvorenie komunikácie Použitie jednoduchý try CitacSuboru subor = null; SietovyVysielac vysielac = null; subor = new CitacSuboru("cesta_k_suboru"); vysielac = new SietovyVysielac("adresa_prijemcu"); //čítanie súboru a posielanie údajov cez sieť finally { if (subor!= null) { subor.close(); //metóda close zvyčaje môže vyhodiť výnimku if (vysielac!= null) { vysielac.close();//metóda close zvyčaje môže vyhodiť výnimku catch... Použitie try-with-resource try ( CitacSuboru subor = new CitacSuboru("cesta_k_suboru"); SietovyVysielac vysielac=new SietovyVysielac("adresa_prijemcu"); ) { //čítanie súboru a posielanie údajov cez sieť //metódy close sa vykonajú automaticky catch... 13

Použitie kontrolovaných a nekontrolovaných výnimiek - Pri vytváraní vlastných typov výnimiek je väčšinou vhodné, aby tieto výnimky boli kontrolované. - Uvádzanie výnimiek, ktoré môže metóda spôsobiť je v popise (dokumentácii) metódy rovnako dôležité ako vstupné parametre a návratová hodnota. To sa týka hlavne kontrolovaných výnimiek. - Výnimky za behu (napr. aritmetické výnimky, prístup k členu cez null) môžu nastať na ľubovoľnom mieste programu a v typickom programe ich môže byť veľa. Sú následkom programátorských chýb. Kvôli prehľadnosti sa preto výnimky za behu (runtime exception) nepridávajú do deklarácii metód. Výhoda použitia výnimiek - prehľadnosť - oddelenie logiky hlavného programu od spracovania chýb - ak je spracovanie chyby v niektorej nadradenej metóde v zásobníku volaní, netreba prenášať informáciu o chybe cez návratové hodnoty, alebo cez argumenty. Informácie sa prenášajú v objekte výnimky - možnosť informovať o chybe počas vykonávania konštruktora (konštruktor môže podobne ako metóda tiež spôsobiť výnimku) 14