29. Výjimky, jejich vznik, vyhození, odchyt a zpracování. (A7B36PVJ)



Podobné dokumenty
Z. Kotala, P. Toman: Java ( Obsah )

Semin aˇr Java V yjimky Radek Ko ˇc ı Fakulta informaˇcn ıch technologi ı VUT Unor 2008 Radek Koˇc ı Semin aˇr Java V yjimky 1/ 25

Java Výjimky Java, zimní semestr

Tento studijní blok má za cíl pokračovat v základních prvcích jazyka Java. Konkrétně bude věnována pozornost rozhraním a výjimkám.

Soubor jako posloupnost bytů

Výjimky. v C# a Javě

Michal Krátký. Úvod do programovacích jazyků (Java), 2006/2007

Java Řetězce Java, zimní semestr

Výjimky. Tomáš Pitner, upravil Marek Šabo

Java - výjimky. private void vstup() throws IOException {... }

8. přednáška: Soubory a proudy

Výjimky. A0B36PR2-Programování 2 Fakulta elektrotechnická České vysoké učení technické

1. Programování proti rozhraní

17. Projekt Trojúhelníky

10. března 2015, Brno Připravil: David Procházka. Programovací jazyk C++

KTE / ZPE Informační technologie

Připravil: David Procházka. Programovací jazyk C++

Více o konstruktorech a destruktorech

1. Téma 12 - Textové soubory a výjimky

Obsah přednášky 7. Základy programování (IZAPR) Přednáška 7. Parametry metod. Parametry, argumenty. Parametry metod.

Programování v Javě I. Únor 2009

Výčtový typ strana 67

Programovací jazyk Java

Programování v Javě I. Leden 2008

Zpracování výjimečných situací

2) Napište algoritmus pro vložení položky na konec dvousměrného seznamu. 3) Napište algoritmus pro vyhledání položky v binárním stromu.

Úvod do programovacích jazyků (Java)

Dědičnost (inheritance)

Výjimky a ošetřování chyb v PHP. Who is General Failure and why is he reading my disk?!

Jazyk C++ II. Výjimky

Class loader. každá třída (java.lang.class) obsahuje referenci na svůj class loader. Implementace class loaderu

Úvod do programování - Java. Cvičení č.4

Programování v C++ 1, 17. cvičení

Java a XML. 10/26/09 1/7 Java a XML

IW5 - Programování v.net a C# 4 Pokročilé konstrukce C#

Abstraktní datové typy: zásobník

Principy objektově orientovaného programování

Programové konvence, dokumentace a ladění. Programování II 2. přednáška Alena Buchalcevová

Algoritmizace a programování

Michal Krátký. Úvod do programovacích jazyků (Java), 2006/2007

8 Třídy, objekty, metody, předávání argumentů metod

Pokročilé programování v jazyce C pro chemiky (C3220) Třídy v C++

Generické programování

PB161 programování v C++ Výjimky Bezpečné programování

Dědění, polymorfismus

7 Formátovaný výstup, třídy, objekty, pole, chyby v programech

Teoretické minimum z PJV

Zapouzdření. Tomáš Pitner, upravil Marek Šabo

TŘÍDY POKRAČOVÁNÍ. Události pokračování. Příklad. public delegate void ZmenaSouradnicEventHandler (object sender, EventArgs e);

Výjimky ( exceptions )

Algoritmizace a programování

Počítačové laboratoře bez tajemství aneb naučme se učit algoritmizaci a programování s využitím robotů CZ.1.07/1.3.12/

Obsah přednášky 9. Skrývání informací. Skrývání informací. Zapouzdření. Skrývání informací. Základy programování (IZAPR, IZKPR) Přednáška 9

III/2 Inovace a zkvalitnění výuky prostřednictvím ICT

PREPROCESOR POKRAČOVÁNÍ

Pokud zadání nerozumíte nebo se vám zdá nejednoznačné, zeptejte se. Pište čitelně, nečitelná řešení nebudeme uznávat.

Statické proměnné a metody. Tomáš Pitner, upravil Marek Šabo

Pokročilé programování v jazyce C pro chemiky (C3220) Operátory new a delete, virtuální metody

7. přednáška - třídy, objekty třídy objekty atributy tříd metody tříd

Programování v jazyku Java hierarchie tříd, přetypování, výjimky

7. Datové typy v Javě

Ošetření chyb a výjimky

Seminář Java II p.1/43

Ošetřování chyb v programech

Datové struktury. alg12 1

Syntaxe vyjímek. #include <iostream> #include <string> using namespace std; // Trida vyjimek class Vyjimka { private:

Projekty pro výuku programování v jazyce Java

DSL manuál. Ing. Jan Hranáč. 27. října V této kapitole je stručný průvodce k tvorbě v systému DrdSim a (v

IRAE 07/08 Přednáška č. 1

RMI Remote Method Invocation

7. Dynamické datové struktury

IRAE 07/08 Přednáška č. 7. Začátek (head)

Abstraktní třída a rozhraní

Algoritmizace, základy programování, VY_32_INOVACE_PRG_ALGO_01

Objektově orientované programování v jazyce Python

IRAE 07/08 Přednáška č. 2. atr1 atr2. atr1 atr2 -33

Pokročilé programování v jazyce C pro chemiky (C3220) Pokročilá témata jazyka C++

Objektově orientované programování v jazyce Python

C# konzole Podíl dvou čísel, podmínka IF

SOUBORY, VSTUPY A VÝSTUPY POKRAČOVÁNÍ

JUnit příklad na použití

III/2 Inovace a zkvalitnění výuky prostřednictvím ICT

JAVA. Krátke poznámky:

Polymorfismus. Časová náročnost lekce: 3 hodiny Datum ukončení a splnění lekce: 30.března

Programování jako nástroj porozumění matematice (seriál pro web modernivyuka.cz)

Mělká a hluboká kopie

Úvod do programovacích jazyků (Java)

Testování. Zadání příkladu. Vytvoření kostry třídy. Obsah:

Funkční objekty v C++.

Programování II. Návrh programu I 2018/19

Při studiu tohoto bloku se předpokládá, že student je zvládá základy programování v jazyce Java s využitím vývojového prostředí NetBeans.

PB161 Programování v jazyce C++ Přednáška 7

PB161 Programování v jazyce C++ Přednáška 7

Typický prvek kolekce pro české řazení

<surface name="pozadi" file="obrazky/pozadi/pozadi.png"/> ****************************************************************************

PROMĚNNÉ, KONSTANTY A DATOVÉ TYPY TEORIE DATUM VYTVOŘENÍ: KLÍČOVÁ AKTIVITA: 02 PROGRAMOVÁNÍ 2. ROČNÍK (PRG2) HODINOVÁ DOTACE: 1

Řídicí struktury. alg3 1

5 Rekurze a zásobník. Rekurzivní volání metody

9. přednáška - třídy, objekty

Transkript:

29. Výjimky, jejich vznik, vyhození, odchyt a zpracování. (A7B36PVJ) Vý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. Výjimky způsobují nepředpokládatelné kombinace vstupů, poruchy HW, atd.. Když v Javě vznikne výjimka, vytvoří se v programu objekt, který ponese informace o vzniklém problému do místa, kde tento problém bude možné vyřešit. Nositelem informace o druhu problémů, je především typ tohoto objektu, navíc do tohoto objektu lze uložit další informace o daném problému. Výjimky jsou tedy objekty, které sloužící k indikaci a nápravě chyb v běhu programu. Třídy pro přenos informací o výjimkách Výjimky jsou instance tříd, které patří do stromu tříd java.lang.throwable, odkud dědí všechny metody. Pouze částečný strom rodiny Throwable. Rozhraní Throwable má 2 potomky Exception (výjimka) a Error (chyba). Výjimky (Exceptions) jsou takové stavy, ze kterých se program může zotavit (například přistupujeme mimo velikost pole, nebo nastala chyba při čtení souboru). Z chyb (Error) se již korektní program nemá zotavit (například dojde paměť). Existují dva druhy výjimek checked (kontrolované) a unchecked (nekontrolované). Platí zásada, že pokud výjimka patří do stromu java.lang.runtimeexception, je nekontrolovaná, jinak je kontrolovaná. checked (kontrolované, hlídané, synchronní) - vyžadují ošetření klauzulí try catch anebo vyznačení throws v hlavičkách metod. unchecked (nekontrolované, nehlídané, asynchronní) - nevyžaduje vyznačení ani ošetření. Jde o výjimky, které nemusí programátor kontrolovat, protože se nepředpokládá, že nastanou. Příkladem je procházení pole, nemá smysl každý přístup do pole uzavírat do try catch bloku.

Vznik výjimek Výjimky buď vyhazuje JVM ( např. NullPointerException ), nebo se o vznik výjimky musí postarat programátor. K vyvolání výjimky slouží klíčové slovo throw, za nímž uvedeme odkaz na objekt, který ponese informace o chybě. Můžeme použít odkaz na existující objekt, nebo můžeme vytvořit nový pomocí new. Po vzniku výjimky se přeruší přirozené pořadí provádění příkazů a program začne hledat handler, část kódu, která vzniklou situaci ošetří. Pomocí throws nemusí být deklarovány: potomci java.lang.error potomci java.lang.runtimeexception je potomek java.lang.exception př. NullPointerException, ArrayIndexOutOfBoundException Generování výjimek Pro generování/vyhození výjímek slouží klíčové slovo throw throw: vyhodí výjimku parametr reference na objekt typu Throwable Příklad throw new MojeVyjimka(); Vyhazovat lze existující výjimky, častěji však vlastní výjimky.

java.lang.throwable Má atribut (private) typu String: obsahuje podrobnější popis výjimky metoda String getmessage() Konstruktory: Throwable() Throwable(String mesg) Throwable(String mesg, Throwable cause) od 1.4 Throwable(Throwable cause) od 1.4 Metody: void printstacktrace() + všechny přetížené varianty a další méně význámné viz dokumentace Vlastní výjimky Vlastní výjimky se vytvoří jako potomek již existující výjimky. Pokud nová výjimka nepřidává žádné vlastní atributy či metody, pak je lepší použít již existující výjimku a pouze změnit text. Při vytvoření vlastní výjimky obvykle definujeme dva konstruktory ( jeden bez parametrů, druhý s parametrem String pro uložení doprovodné zprávy ). Vše ostatní se dědí z třídy Throwable. Hlavním indikátorem závady je ( často velmi dlouhé ) jméno výjimky tím vzniká integrovaný chybník pro run-time. Příklad vlastní výjimky: public class NegativeAgeException extends Exception private int age; public NegativeAgeException(int age) this.age = age; public String tostring() return "Věk nemůže nabývat záporných hodnot: " + age ;

Použití vlastní výjimky: public class CustomExceptionTest public static void main(string[] args) throws Exception int age = getage(); if (age < 0) throw new NegativeAgeException(age); else System.out.println("Age entered is " + age); static int getage() return -10; Generování výjimek Mechanizmus výjimek je časově náročný - má se využívat jen při závadách a nikoli pro testy podmínek. Deklarované výjimky se objeví ve standardní dokumentaci metod. Při jednoduchých pokusech lze obejít nepřehledné try klauzule připsáním throwsexception do hlaviček. Jakoukoli výjimku deklarovanou v signatuře není programátor nucen uvnitř metody ošetřovat. Odchyt a zpracování výjimek Ke zpracování výjimek v Javě slouží klauzule try. Ta se skládá nejméně ze dvou bloků. Existují 3 typy bloků: hlídač - try ( právě jeden ) řešitel - catch ( libovolný počet ) uklízeč - finally ( nanejvýš jeden ) Klauzule try může mít tři tvary: try - catch - finally try - catch try - finally

try //... zde je blok kódu, kde může nastat chyba a chceme ji ošetřit catch (Exception1 e) // ošetření výjimky typu Exception1 a všech jejích podtypů catch (Exception2 e) // ošetření výjimky typu Exception2 a všech jejích podtypů finally // provede se vždy Zjednodušeně řečeno: Pokud výjimku neodchytí blok, kde nastala, šíří se do následujícího vyššího bloku, Pokud není odchycena v metodě, šíří se do volající metody, Pokud se dostane až do main() a není odchycena, způsobí ukončení interpretu Javy - vypíšou se informace o výjimce, kde nastala a jak se šířila. Hlídač - try Hlídač dozírá, byla-li v bloku vyhozena výjimka ( nezáměrně či záměrně ): Ne: Před odchodem z hlídaného bloku předá řízení uklízeči. Ano: Další příkazy v try bloku se již neprovedou. Hlídač zjistí typ výjimky a procházením řešitelů shora dolů se snaží najít prvního kompetentního řešitele, tj. takového, jehož parametr je typem nebo nadtypem výjimky: Nalezne-li ho, předá mu řízení. Nenalezne-li řešitele, předá řízení uklízeči a pak nevyřešenou výjimku vyhodí do nadbloku. Je-li tím blokem obalová try klauzule postupuje se obdobně. Jeli tím blokem metoda, pak tato metoda vyhodí výjimku do příkazu metody, odkud byla zavolána a tam se postupuje obdobně. Nenalezne-li se žádný kompetentní řešitel, vyhodí se výjimka do obalové klauzule JVM - odtud byla zavolána metoda main(string* + args) - pak JVM vypíše hlášení a ukončí běh. Řešitel - catch Řešitel má prostřednictvím parametru referenci k aktuální výjimce i dalším proměnným a může situaci trochu napravit anebo alespoň řádně ohlásit. Nelze však nijak zařídit pokračování v nedokončeném hlídaném bloku. I když řešitel vůbec nic neudělá, je odchycená výjimka sežrána - nic jsme neudělali tedy problém není odstraněn. I řešitelé a uklízeč mohou vyhodit nějakou výjimku - tu však zpracuje ( dynamicky ) obalová try klauzule. Též lze sestrojit novou výjimku a jako její příčinu vložit tu původní.

Uklízeč - finally Tento blok se provede vždy, proto do tohoto bloku dáváme příkazy pro uvolňování systémových prostředků, které byly alokovány v try bloku. Příkaz assert Tento příkaz nespadá přímo pod tuto otázku, ale je dobré vědet k čemu slouží. Během ladění programu se snažíme obvykle na různá místa vkládat kontroly, zda platí určité předem dané podmínky. Například zda se nepokoušíme volat nějakou funkci s nesprávnou hodnotou argumentu. Tyto kontroly pak v okamžiku, kdy jsme zcela přesvědčeni o správnosti svého programu a zajímá nás již jen jeho rychlost, odstraníme nebo případě převedeme na komentáře. Brzy na to po objevení další chyby testy opět obnovujeme. Lepším řešením je použití příkazu assert, jenž umožňuje do přeloženého programu zařadit kontrolu, zda je splněna podmínka uvedená za klíčovým slovem assert. Pokud tato podmínka splněna není, vyvolá se výjimka AssertionError. Testovanou podmínku můžeme doplnit po dvojtečce textovým řetězcem(případně libovolným objektem, pro jehož výpis se použije jeho metoda tostring.), který se uloží jako popis výjimky. Příkaz assert byl do jazyka Java doplněn až ve verzi 1.4. Při spuštění programu se pak v případě, že zadáme parametr -ea, provádí kontrola splnění zadaných podmínek. Pokud tento parametr nezadáme, kontrola podmínek se neprovádí a výpočet se tak ničím nezdržuje. Příklad: Definujte funkci, která vrátí převrácenou hodnotu nenulového čísla. Ošetřete situaci, kdy je jako argument předána nulová hodnota. S použitím příkazu assert bude řešení včetně testovacího programu následující: class TestAssert static double prevracena_hodnota(double x) assert x!= 0.0 : "Argument nesmi byt nulovy"; return 1.0 / x; public static void main(string args[]) System.out.println(prevracena_hodnota(1)); System.out.println(prevracena_hodnota(0)); Příkaz assert je vhodné uvádět na těch místech programu, kde potřebujeme zaručit platnost určité podmínky vyplývající přímo z logiky programu. Příkazem assert určitě nebudeme ošetřovat chyby vzniklé činností uživatele, neplatnost uvedené podmínky vždy indikuje chybu v našem programu (nebo chybně stanovenou podmínku, i na to si musíme dát pozor).

Příklad - Čtení ze souboru Metoda nactibajt otevře soubor zadaného jména (1) a načte z něj první byte, který vypíše na standardní výstup(2). void nactibajt(string jmenosouboru) try FileInputStream soubor = new FileInputStream(jmenoSouboru); // (1) System.out.println(soubor.read()); // (2) catch(filenotfoundexception e) // (3) System.out.println("Soubor " + jmenosouboru + "nenalezen."); // (4) catch(ioexception e) // (5) System.out.println("Chyba při čtení souboru " + jmenosouboru);// (6) Při pokusu otevření souboru se může stát, že tento nebude nalezen (nastane výjimka FileNotFoundException), např. pokud soubor neexistuje nebo je chybně zadané jméno. Pokud tento výjimečný stav nastane, je zachycen blokem catch na řádce (3) a vypíše se chybová zpráva (4). Také při čtení může nastat chyba (výjimka IOException), např. pokud soubor není určen pro čtení nebo nastane chyba zařízení. Tento stav zachycuje blok catch na řádce (5) a vypíše se chybová zpráva (6). Pokud vše proběhne bez problémů, pokračuje program za záchytnými bloky (metoda skončí). Slovníček pojmů Výjimka (obecně) - Událost, která naruší normální běh instrukcí Výjimka (v Javě) - Objekt, který nese informace o vzniklém problému Typy výjimek: checked (kontrolované) - vyžadují ošetření klauzulí try catch anebo vyznačení throws unchecked (nekontrolované) - nevyžaduje vyznačení ani ošetření try (hlídač) - Hlídá, jestli byla v bloku vyhozena výjimka catch (řešitel) - Ošetřuje výjimku daného datového typu finally (uklízeč) - Nepovinný, pokud je deklarován provede se vždy throw - Používá se k vyhození výjimky throws - Příkaz, který se zapisuje v signatuře metody. Za throws následuje výčet datových typů výjimek, které může metoda vyhazovat assert - Umožňuje zařadit kontrolu, zda je splněna podmínka uvedená za klíčovým slovem assert JVM - Java Virtual Machine

Zdroje Přednášky k předmětu Y36PJV - Programování v Jazyku Java Java bez předchozích znalostí Exceptions in Java http://www.javaworld.com/javaworld/jw-07-1998/jw-07-exceptions.html [http://www.javaworld.com/javaworld/jw-07-1998/jw-07-exceptions.html] Úvod do JAVY, 4.část - exceptions http://www.linuxzone.cz/index.phtml?ids=2&idc=136 13. Výjimky http://v1.dione.zcu.cz/java/sbornik/13.html Creating user defined exceptions http://www.javabeat.net/tips/29-creating-user-defined-exceptions.html