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

Podobné dokumenty
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. private void vstup() throws IOException {... }

Z. Kotala, P. Toman: Java ( Obsah )

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

Java Výjimky Java, zimní semestr

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

Soubor jako posloupnost bytů

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

Výjimky. v C# a Javě

6. Příkazy a řídící struktury v Javě

Úvod do programovacích jazyků (Java)

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

Java Řetězce Java, zimní semestr

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

Funkce - opakování. Funkce může přijímat parametry na vstupu a může vracet parametry na výstupu.

Úvod do programovacích jazyků (Java)

KTE / ZPE Informační technologie

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

Operátory, výrazy. Tomáš Pitner, upravil Marek Šabo

Chyby a výjimky. Chyba. Odkud se chyby berou? Kdo chyby opravuje? Co můžete dělat jako programátor? Dvě hlavní metody práce s chybami.

Příkazy a řídicí struktury v Javě. Tomáš Pitner, upravil Marek Šabo

JUnit příklad na použití

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.

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

Ošetřování chyb v programech

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

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

Distribuované systémy a výpočty

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

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

Výchozí a statické metody rozhraní. Tomáš Pitner, upravil Marek Šabo

17. Projekt Trojúhelníky

Datové typy v Javě. Tomáš Pitner, upravil Marek Šabo

Logické operace. Datový typ bool. Relační operátory. Logické operátory. IAJCE Přednáška č. 3. může nabýt hodnot: o true o false

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/

Neměnné objekty. Tomáš Pitner, upravil Marek Šabo

RMI Remote Method Invocation

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

Seminář Java II p.1/43

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

Jazyk C++ II. Výjimky

Viditelnost (práva přístupu) Tomáš Pitner, upravil Marek Šabo

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

Univerzita Palackého v Olomouci Radek Janoštík (Univerzita Palackého v Olomouci) Základy programování 4 - C# 3.4.

Programování v Javě I. Leden 2008

Zápis programu v jazyce C#

7. Datové typy v Javě

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

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

Datové struktury. alg12 1

Práce s textem. Třída Character. Třída Character. Třída Character. reprezentuje objekty zapouzdřující hodnotu typu char (boxing / unboxing)

Čipové karty Lekařská informatika

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

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

JAVA. Další jazyky kompilovatelné do Java byte-code

Algoritmizace a programování

Výjimky (exceptions), generické metody a třídy v C#

Regulární výrazy. Vzory

KTE / ZPE Informační technologie

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.

Dědičnost (inheritance)

Jazyk C# a platforma.net

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

Řídicí struktury. alg3 1

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

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

Teoretické minimum z PJV

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

Abstraktní datové typy: zásobník

Úvod do programovacích jazyků (Java)

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

typová konverze typová inference

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

SPJA, cvičení 1. ipython, python, skripty. základy syntaxe: základní datové typy, řetězce. podmínky: if-elif-else, vyhodnocení logických výrazů

Pascal. Katedra aplikované kybernetiky. Ing. Miroslav Vavroušek. Verze 7

Distribuované systémy a výpočty

Generické programová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.

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

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

Jazyk C# (seminář 5)

Datové struktury. Obsah přednášky: Definice pojmů. Abstraktní datové typy a jejich implementace. Algoritmizace (Y36ALG), Šumperk - 12.

Příklad aplikace Klient/Server s Boss/Worker modelem (informativní)

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

NIO. Aplikační programování v Javě (BI-APJ) - 12 Ing. Jiří Daněček Katedra softwarového inženýrství Fakulta informačních technologií ČVUT Praha

Reflexe. Aplikační programování v Javě (BI-APJ) - 8 Ing. Jiří Daněček Katedra softwarového inženýrství Fakulta informačních technologií ČVUT Praha

Typický prvek kolekce pro české řazení

Algoritmizace a programování

Obsah. O auto ro vi 13 V ěnování 14 Poděkování 15 Z p ětn á vazba od čtenářů 16. P rogram ování pro M in ecraft v Jávě 17

Iterator & for cyklus

3. přednáška. Obsah: Řídící struktury sekvence, if-else, switch, for, while, do-while. Zpracování posloupnosti

Univerzita Palackého v Olomouci Radek Janoštík (Univerzita Palackého v Olomouci) Základy programování 4 - C# 19.2.

Výjimky a soubory. Jiří Vokřínek. Katedra počítačů Fakulta elektrotechnická České vysoké učení technické v Praze

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

Středoškolská technika 2017 PROGRAM NA GENEROVÁNÍ PRVOČÍSEL

- znakové konstanty v apostrofech, např. a, +, (znak mezera) - proměnná zabírá 1 byte, obsahuje kód příslušného znaku

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

1. lekce. do souboru main.c uložíme následující kód a pomocí F9 ho zkompilujeme a spustíme:

Přednáška 7. Celočíselná aritmetika. Návratový kód. Příkazy pro větvení výpočtu. Cykly. Předčasné ukončení cyklu.

Textové soubory. alg9 1

Transkript:

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

K čemu jsou výjimky Výjimky jsou mechanizmem umožňujícím reagovat na nestandardní (tj. chybové) běhové chování programu, které může mít různé příčiny: chyba okolí: uživatele, systému vnitřní chyba programu: tedy programátora. Proč výjimky Mechanizmus, jak psát robustní, spolehlivé programy odolné proti chybám "okolí" i chybám v samotném programu. Výjimky v Javě fungují podobně jako v C++, C#, Ruby, Pythonu a dalších zejména objektových jazycích. v Javě jsou ještě lépe implementovány než v C++ (navíc klauzule finally) Podobně jako jinde, ani v Javě není dobré výjimkami potlačovat očekávané chyby programu samotného to by bylo hrubé zneužití. Co technicky jsou výjimky Výjimka (Exception) je objektem třídy java.lang.exception nebo její podtřídy. Příbuzným typem jsou rovněž vážné běhové chyby objekty třídy java.lang.error. Každopádně v obou případech rozšiřuje třídu java.lang.throwable. Ta je také často používaná jako deklarativní typ pro výjimky v širším slova smyslu. Kdy výjimka vznikne Objekt výjimky je vyhozen (throw) buďto: 1. automaticky běhovým systémem Javy, nastane-li nějaká běhová chyba např. dělení nulou, nebo 2. jsou vytvořeny a vyhozeny samotným programem, zdetekuje-li nějaký chybový stav, na nějž je třeba reagovat např. do metody je předán špatný argument. Příklad vzniku výjimky 1

try { // First, the exception can be raised in JVM when // dereferencing using a bad index in an array: String name = args[i]; // ArrayIndexOutOfBoundsException // or the exception(s) can be raised by programmer // in the constructor of Person // NullPointerException or IllegalArgumentException p = new Person(name); catch(arrayindexoutofboundsexception e) { System.err.println("No valid person name specified"); System.exit(1); catch(nullpointerexception e) { // reaction upon NullPointerException occurence catch(illegalargumentexception e) { // reaction upon IllegalArgumentException occurence Programové bloky pro práci s výjimkami Bloky programu pro práci s výjimkami: try blok vymezující místo, kde může výjimka vzniknout catch blok, který se vykoná, nastane-li výjimka odpovídající typu v catch finally blok, který se vykoná vždy, viz dále. Co se s vyhozenou výjimkou stane Vyhozený objekt výjimky je buďto: 1. Zachycen v rámci metody, kde výjimka vznikla a to v bloku catch. Takto to fungovalo ve výše uvedeném příkladu všechny výjimky byly zachyceny a řešeny svými bloky catch. 2. Nebo výjimka propadne do nadřazené (volající) metody, kde je buďto v bloku catch zachycena nebo opět propadne atd. Výjimka tedy "putuje programem" tak dlouho, než je zachycena. Pokud není nikde zachycena, běh JVM skončí s hlášením o výjimce. 2

Syntaxe kódu s ošetřením výjimek try { //zde může vzniknout výjimka catch (ExceptionType exceptionvariable) { // zde je výjimka ošetřena // je možné zde přistupovat k "exceptionvariable" Bloku try se říká hlídaný blok, protože výjimky příslušného typu uvedeného v hlavičce/-ách bloků catch zde vzniklé jsou zachyceny. Reakce na výjimku možnosti Jak můžeme na vyhozenou výjimku reagovat? Napravit příčiny vzniku chybového stavu např. znovu nechat načíst vstup nebo poskytnout za chybný vstup náhradu např. implicitní hodnotu; Operaci neprovést a sdělit chybu výše tím, že výjimku propustíme z metody (propadne z ní). Možnost úniku výjimky (propuštění) z metody se deklaruje pomocí throws v hlavičce metody. Reakce na výjimku pravidla Vždy nějak reagujme, tzn. výjimku neignorujme, nepotlačujme. Tudíž blok catch nenechávejme prázdný, přinejmenším vypišme e.printstacktrace(). Nelze-li rozumně reagovat na místě, propusťme výjimku výše a popišme to v dokumentaci, viz následující příklad. Příklad komplexní reakce na výjimku 3

int i = 0; String param; int cislo = 0; boolean ok = false; do { try { // zde může vzniknout výjimka ArrayIndexOutOfBoundsException param = args[i]; // zde může vzniknout výjimka NumberFormatException cislo = Integer.parseInt(param); // sem se dostane, jen když nevznikla žádná výjimka ok = true; catch (NumberFormatException nfe) { // sem se dostane, byl-li vstup ve špatném formátu (ne číslo) System.err.println("Parametr "+i+" neni platne cele cislo"); i++; // zkusíme další parametr catch (ArrayIndexOutOfBoundsException iob) { // sem se dostane, byl-li překročena velikost pole -> chybový výstup err System.err.println("Nepredan zadny ciselny parametr"); // sami vyhodíme výjimku throw new IllegalArgumentException( "Nezadan zadny celociselny parametr."); while (!ok); System.out.println("Zadano cislo="+cislo); Kaskády bloků catch V některých blocích try mohou vzniknout výjimky více typů pak můžeme uvádět více catch po sobě, viz přechozí příklad. Pokud catch takto řetězíme, musíme respektovat, že výjimka bude zachycena nejbližším příhodným catch a překladač si ohlídá, že kód neobsahuje nedosažitelné catch-bloky. Pozor tedy na řetězení catch s výjimkami typů z jedné hierarchie tříd. Vždy musí být výjimka z podtřídy (tj. speciálnější) uvedena a tedy zachycována dříve než výjimka obecnější. Příklad kaskády catch špatně (1) Definice vlastních výjimek jedna podtřídou druhé class MyException1 extends Exception { class MyException2 extends MyException1 { 4

Příklad kaskády catch špatně (2) Jejich chybné použití v kaskádě try { if (args.length == 0 args[0].equals("1")) throw new MyException1(); else if (args[0].equals("2")) throw new MyException2(); // CHYBA: v kaskádě je nejprve zachycována obecnější výjimka MyException1 catch (MyException1 mv) { System.out.println("Zachycena vyjimka typu MyException1: " + mv); // speciálnější výjimka MyException2 by nikdy nebyla zachycena, // proto překladač takovou konstrukce ani nepřeloží. catch (MyException2 mv) { System.out.println("Zachycena vyjimka typu MyException2: "+mv); 5