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



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

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

Výjimky. v C# a Javě

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.

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

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

Soubor jako posloupnost bytů

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

Úvod do programovacích jazyků (Java)

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

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

Dědičnost (inheritance)

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

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

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

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.

17. Projekt Trojúhelníky

Algoritmizace a programování

Algoritmizace, základy programování, VY_32_INOVACE_PRG_ALGO_01

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

KTE / ZPE Informační technologie

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

KTE / ZPE Informační technologie

Obsah. Úvod 11 Základy programování 11 Objektový přístup 11 Procvičování 11 Zvláštní odstavce 12 Zpětná vazba od čtenářů 12 Errata 13

Java Výjimky Java, zimní semestr

1. Programování proti rozhraní

Předmluva k aktuálnímu vydání Úvod k prvnímu vydání z roku Typografické a syntaktické konvence... 20

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

PREPROCESOR POKRAČOVÁNÍ

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

7. Datové typy v Javě

TÉMATICKÝ OKRUH Softwarové inženýrství

RMI Remote Method Invocation

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

4. ZÁKLADNÍ POJMY Z OBJEKTOVĚ ORIENTOVANÉHO PROGRAMOVÁNÍ

Regulární výrazy. Vzory

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

PŘETĚŽOVÁNÍ OPERÁTORŮ

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

Výčtový typ strana 67

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

Java Řetězce Java, zimní semestr

Textové soubory. alg9 1

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

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

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

Řídicí příkazy KAPITOLA 3. Vstup znaků z klávesnice

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

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

Řídicí struktury. alg3 1

Algoritmizace a programování

Programování v Javě I. Leden 2008

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

Algoritmizace a programování. Terminálový vstup a výstup

JUnit příklad na použití

Seminář Java II p.1/43

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

Více o konstruktorech a destruktorech

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

6 Příkazy řízení toku

Příkaz while. while (podmínka) { příkaz; } Příklad: int i=0; while (i < 10) { System.out.println(i); i++; } // vypíše čísla od 0 do 9

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

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

Úvod do programovacích jazyků (Java)

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

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

Úvod do programovacích jazyků (Java)

Ošetřování chyb 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.

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

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

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

Obsah přednášky. Příkaz for neúplný. Příkaz for příklady. Cyklus for each (enhanced for loop) Příkaz for příklady

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/

Programovací jazyk Java

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

Typický prvek kolekce pro české řazení

Datové struktury. alg12 1

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

Jazyk C++ II. Výjimky

Ošetření chyb a výjimky

IAJCE Přednáška č. 8. double tprumer = (t1 + t2 + t3 + t4 + t5 + t6 + t7) / 7; Console.Write("\nPrumerna teplota je {0}", tprumer);

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

KTE / ZPE Informační technologie

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

8. lekce Úvod do jazyka C 3. část Základní příkazy jazyka C Miroslav Jílek

Obsah 7. přednášky: Tato tematika je zpracována v Záznamy přednášek: str

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

Abstraktní datové typy: zásobník

Paměť počítače. alg2 1

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

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

PROGRAMOVÁNÍ V C++ CVIČENÍ

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

Čtvrtek 8. prosince. Pascal - opakování základů. Struktura programu:

Projekt Obrázek strana 135

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

Generické programování

Funkce, podmíněný příkaz if-else, příkaz cyklu for

Transkript:

Z. Kotala, P. Toman: Java ( Obsah ) 13. Výjimky 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. 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í: // 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 Hlídaný blok try - uzavírá kritickou část programu, kde "může" být vyvolána výjimka. Záchytné bloky catch - ošetřují výjimky, musí následovat bezprostředně za blokem try a může jich být libovolný počet. Vyvolaná výjimka je objekt a každý záchytný blok zachycuje jeden typ výjimek (třídavýjimek1, třídavýjimek2). Na vyvolanou výjimku v záchytném bloku odkazuje referenční proměnná (jménoproměnné1, jménoproměnné2). Pokud v hlídaném bloku výjimka: není vyvolána, pokračuje pokračuje program za posledním záchytným blokem. je vyvolána, pokračuje program prvním záchytným blokem, který ošetřuje odpovídající třídu výjimek (viz 13.1.). Po opuštění záchytného bloku pokračuje program za posledním záchytným blokem. Hlídané a záchytné bloky je možné do sebe vnořovat, tj. každý záchytný blok může opět obsahovat dvojici bloků try-catch. Priklad 13.1. 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 (1) (2). void nactibajt(string jsouboru) { FileInputStream soubor = new FileInputStream(jSouboru); // (1) System.out.println(soubor.read()); // (2) catch(filenotfoundexception e) { // (3) System.out.println("Soubor " + jsouboru + "nenalezen."); // (4)

System.out.println("Soubor " + jsouboru + "nenalezen."); // (4) catch(ioexception e) { // (5) System.out.println("Chyba při čtení souboru " + jsouboru);// (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čí). 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ýjimek Rodičovskou třídou všech výjimek je Throwable (z balíku java.lang), která má standardně dva přímé potomky: Error - reprezentuje fatální chyby, které by neměly být zachycovány, neboť se z nich nelze zotavit (chyba JVM apod.). Exception - slouží jako rodičovská třída pro všechny ostatní výjimky. Čá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: Priklad 13.2.

//... catch(arithmeticexception e) { // zachycení výjimek třídy ArithmeticException catch(exception e) { // zachycení všech výjimek třídy Exception, tj. // InterruptedException, RuntimeException, // IndexOutOfBoundsException atd. (kromě ArithmeticException ) 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ýjimky Vý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ů. Priklad 13.3. Vyvolání výjimky třídy ArithmeticException se provede pomocí: throw new ArithmeticException(); 13.3. Deklarace výjimek Vš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í): Priklad 13.4. Konstruktor FileInputStream(), který otevírá soubor zadaného jména (viz příklad 13.1.) neošetřuje případ, že soubor není nalezen (nastane výjimka FileNotFoundExeption) a přenechává tuto starost volající metodě. Ta může nechat uživatele zadat jméno souboru znovu, doplnit si jméno sama, skončit atd. 13.4. Propagace výjimek Výjimka může být uvnitř metody vyvolána dvěma způsoby: příkazem throw (viz 13.2.),

příkazem throw (viz 13.2.), voláním metody, která výjimku deklaruje (viz 13.3.). 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. Priklad 13.5. public class Test { public static void main(string[] args) { a(); // (1) catch(exception e) { // (2) System.out.println("Výjimka zachycena."); // (3) e.printstacktrace(); // (4) static void a() throws Exception { // (*) b(); // (5) static void b() throws Exception { // (**) throw new Exception(); // (6) Program začíná metodou main(), kde je volána metoda a() (1), která následně volá metodu b() (5), v níž je vyvolána výjimka Exception (6). Tato výjimka není metodou b() zachycena a je proto propagována do volající metody a(). Zde rovněž není zachycena a je dále propagována do metody main(), kde je konečně zachycena (2) a způsobí výpis (3,4). Vyjimka zachycena. java.lang.exception at Test.b(A.java:16) at Test.a(A.java:12) at Test.main(A.java:4) Obě metody, v nichž může být výjimka vyvolána, ale není zachycována, ji deklarují (*), (**). 13.5. Runtime výjimky Zvláš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

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 max. jeden nepovinný koncový blok finally následovně: // 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: je v try bloku vyvolána výjimka, kterou žádný catch blok nezachycuje, např. runtime výjimka (viz 13.5.) - a to ještě před propagací této výjimky, je v hlídaném bloku vyvolán příkaz break, continue nebo return (viz kap 9.). Záchytné bloky je též možno vynechat a použít pouze dvojici try - finally: // hlídaný blok finally { // zde uzavřený kód se provede vždy Přechozí zápis má ekvivalentní funkci jako: //... catch(throwable e) { throw e; finally { //... (1) Pro čtení ze souboru použita je třída FileInputStream (viz kap. 15.) z balíku (viz kap. 12.) java.io. Ve stejném balíku jsou definovány i třídy výjimek FileNotFoundException a IOException. (2) Při vyvolání výjimky v hlídaném bloku se hledá první catch blok, který zachycuje odpovídající třídu výjimek. (3) Výjimkou z toho pravidla jsou runtime výjimky (viz 13.5.) a výjimky třídy Error. Converted by Selathco 0.91 on 04.02.2001 19:33