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

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

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

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

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

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

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

Soubor jako posloupnost bytů

Úvod do programovacích jazyků (Java)

Výjimky. v C# a Javě

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

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

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

Java Výjimky Java, zimní semestr

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

RMI Remote Method Invocation

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.

Textové soubory. alg9 1

Dědičnost (inheritance)

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

Programování v Javě I. Leden 2008

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

KTE / ZPE Informační technologie

Typický prvek kolekce pro české řazení

Java Řetězce Java, zimní semestr

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

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

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

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

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

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

Část I Výjimky. Část 1 Výjimky. Výjimky a soubory. Část 2 Soubory. Katedra počítačů Fakulta elektrotechnická České vysoké učení technické v Praze

Regulární výrazy. Vzory

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

Ošetřování chyb v programech

Datové struktury. alg12 1

Algoritmizace a programování

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

Abstraktní datové typy: zásobník

Principy objektově orientovaného 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/

Teoretické minimum z PJV

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

Seminář Java II p.1/43

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

PREPROCESOR POKRAČOVÁNÍ

typová konverze typová inference

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

Definice třídy. úplná definice. public veřejná třída abstract nesmí být vytvářeny instance final nelze vytvářet potomky

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

Generické programování

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

17. Projekt Trojúhelníky

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

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

Správa paměti. Karel Richta a kol. Katedra počítačů Fakulta elektrotechnická České vysoké učení technické v Praze Karel Richta, 2016

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

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

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

JUnit příklad na použití

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

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

6. PRÁCE S DATOVÝMI PROUDY

Základní pojmy. Matice(řádky, sloupce) Matice(4,6) sloupce

Vláknové programování část V

Jazyk C# (seminář 5)

Algoritmizace a programování

Úvod do programovacích jazyků (Java)

KTE / ZPE Informační technologie

Algoritmizace, základy programování, VY_32_INOVACE_PRG_ALGO_01

Java a Caché IV: Manipulace s objekty

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

X-komponenty 3.1. Uživatelská příručka. J. Kocman, V. Trojan

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.

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

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

7. Datové typy v Javě

Java Cvičení 05. CHARLES UNIVERSITY IN PRAGUE faculty of mathematics and physics

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

3 KTE / ZPE Informační technologie

Seznamy a iterátory. Kolekce obecně. Rozhraní kolekce. Procházení kolekcí

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

Výjimky ( exceptions )

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

Vaše jistota na trhu IT. Balíčky. Rudolf Pecinovský

7. Dynamické datové struktury

Abstraktní třída a rozhraní

InputStream. FilterInputStream

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

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

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

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

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

Mobilní robotika. doplňující podklady. Ing. Vít Ondroušek, Ph.D. Ing. Jan Kolomazník, Ph.D.

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

Datové struktury obsah přednášky 1. Úvod 2. Třídy Type-wrapper (obalový typ) pro primitivní typy automatické převody 3. Automatické převody mezi

Práce se soubory v Javě

Jazyk C# (seminář 6)

RMI - Distribuované objekty v Javě

Distribuované systémy a výpočty

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

Transkript:

Seminář Java Výjimky Radek Kočí Fakulta informačních technologií VUT Únor 2008 Radek Kočí Seminář Java Výjimky 1/ 25

Výjimky Co a k čemu jsou výjimky výjimka je mechanizmus umožňující psát robustní, spolehlivé programy robustní ve smyslu odolné proti chybám okolí uživatele, systému,... výjimkami v žádném případě neošetřujeme chyby programu samotného! (hrubé zneužití) režie spojená s vyvoláním výjimky je vysoká! Radek Kočí Seminář Java Výjimky 2/ 25

Výjimky Reprezentace výjimky výjimka (exception) je objekt třídy java.lang.exception Objekty (výjimky) jsou vytvářeny (vyvolávány) buďto automaticky běhovým systémem Javy, nastane-li nějaká běhová chyba, např. dělení nulou, nebo jsou vytvořeny 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 Radek Kočí Seminář Java Výjimky 3/ 25

Výjimky Zpracování výjimky Vzniklý objekt výjimky je předán buďto: v rámci metody, kde výjimka vznikla, do bloku catch výjimka je v bloku catch tzv. zachycena 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í, běh JVM skončí s hlášením o výjimce Radek Kočí Seminář Java Výjimky 4/ 25

Syntaxe kódu s ošetřením výjimek try { //zde můˇze vzniknout výjimka catch (TypVýjimky proměnnávýjimky) { // zde je výjimka ošetřena // je moˇzné přistupovat k proměnnévýjimky Bloku try se říká hlídaný blok, protože výjimky (příslušného hlídaného typu) zde vzniklé jsou zachyceny. V bloku catch jsou zachycené výjimky ošetřeny Radek Kočí Seminář Java Výjimky 5/ 25

Hierarchie výjimek package java.lang Throwable Error Exception RuntimeException Throwable pouze objekty této třídy (a podtříd) mohou být generovány jako výjimky Error vážné chyby JVM (Out Of Memory, Stack Overflow,...) Exception hlídané výjimky (checked exceptions) RuntimeException běhové (runtime, nehlídané unchecked) výjimky, takové výjimky nemusejí být zachytávány Radek Kočí Seminář Java Výjimky 6/ 25

Hlídané výjimky Hlídané výjimky java.lang.exception indikuje podmínky (stavy), které může aplikace chtít ošetřovat musí se explicitně uvádět hlídaná výjimka musí být zpracována! např. java.io.filenotfoundexception Radek Kočí Seminář Java Výjimky 7/ 25

Propuštění hlídané výjimky někdy není nutné či vhodné ošetřovat výjimku na místě metoda může deklarovat, že propouští výjimku (throws) klauzule throws říká, že během zpracování metody může být vygenerovaná uvedená výjimka, která není ošetřena volající metoda musí výjimku zpracovat (zachytit nebo propustit) public FileReader(String filename) throws FileNotFoundException; public void close() throws IOException; Radek Kočí Seminář Java Výjimky 8/ 25

Hlídané výjimky ukázka import java.io.*; public class OtevreniSouboru { public static void main(string[] args) { String jmeno = args[0]; FileReader r; System.err.println("Otviram soubor "+jmeno); r = new FileReader(jmeno); System.err.println("Soubor otevren"); r.close(); Radek Kočí Seminář Java Výjimky 9/ 25

Hlídané výjimky ukázka unreported exception java.io.filenotfoundexception; must be caught or declared to be thrown r = new FileReader(jmeno); unreported exception java.io.ioexception; must be caught or declared to be thrown r.close(); Radek Kočí Seminář Java Výjimky 10/ 25

Ošetření výjimek hierarchie výjimku jsou hierarchicky uspořádané podle dědičnosti jejich tříd nadřazená výjimka pokrývá všechny odvozené výjimky př.: FileNotFoundException je speciálním případem IOException zpracováním IOException zpracujeme i FileNotFoundException Radek Kočí Seminář Java Výjimky 11/ 25

Zachycení výjimky public static void main(string[] args) { String jmeno = args[0]; FileReader r; System.err.println("Otviram soubor "+jmeno); try { r = new FileReader(jmeno); System.err.println("Soubor otevren"); r.close(); catch (IOException ex) { System.err.println("Chyba pri manipulaci se souborem."); Radek Kočí Seminář Java Výjimky 12/ 25

Zachycení výjimky Je možné zpracovat každou výjimku zvlášť. Pozor na řazení podle hierarchie! Radek Kočí Seminář Java Výjimky 13/ 25

Zachycení výjimky public static void main(string[] args) { String jmeno = args[0]; FileReader r; System.err.println("Otviram soubor "+jmeno); try { r = new FileReader(jmeno); System.err.println("Soubor otevren"); r.close(); catch (FileNotFoundException ex) {... catch (IOException ex) {... Radek Kočí Seminář Java Výjimky 14/ 25

Zachycení výjimky chyba public static void main(string[] args) { String jmeno = args[0]; FileReader r; System.err.println("Otviram soubor "+jmeno); try { r = new FileReader(jmeno); System.err.println("Soubor otevren"); r.close(); catch (IOException ex) {... // Nasledujici blok se nikdy neprovede!!! catch (FileNotFoundException ex) {... Radek Kočí Seminář Java Výjimky 15/ 25

Propuštění výjimky public FileReader(String filename) throws FileNotFoundException; public void close() throws IOException; public class OtevreniSouboru { static void otevri(string jmeno) { System.err.println("Otviram soubor "+jmeno); FileReader r = new FileReader(jmeno); r.close(); public static void main(string[] args) { otevri(args[0]); System.err.println("Soubor otevren"); Radek Kočí Seminář Java Výjimky 16/ 25

Propuštění výjimky static void otevri(string jmeno) throws IOException { System.err.println("Otviram soubor "+jmeno); FileReader r = new FileReader(jmeno); r.close(); public static void main(string[] args) { try { otevri(args[0]); System.err.println("Soubor otevren"); catch (IOException ioe) { System.err.println("Nelze otevrit soubor"); Radek Kočí Seminář Java Výjimky 17/ 25

Nehlídané výjimky Nehlídané výjimky java.lang.runtimeexception výjimky, které mohou být generovány během standardních operací JVM nemusí se explicitně uvádět nemusí se zachytávat např. java.lang.arrayindexoutofboundsexception, java.lang.nullpointerexception Radek Kočí Seminář Java Výjimky 18/ 25

Generování výjimky výjimku lze generovat (klíčové slovo throw) public abstract class Reader... { public void mark(int limit) throws IOEXception { throw new IOException("mark() not supported"); public InputStreamReader(.., String charsetname). { if (charsetname == null) throw new NullPointerException("charsetName") Radek Kočí Seminář Java Výjimky 19/ 25

Klauzule finally Klauzule (blok) finally: může následovat ihned po bloku try nebo až po blocích catch slouží k úklidu v každém případě, tj. když je výjimka zachycena blokem catch i když je vygenerovaná jiná než ošetřovaná výjimka i když je výjimka propuštěna do volající metody Používá se typicky pro uvolnění systémových zdrojů uzavření souborů... Radek Kočí Seminář Java Výjimky 20/ 25

Vlastní výjimky typy (tj. třídy) výjimek si můžeme definovat sami bývá zvykem končit názvy tříd (výjimek) na Exception je lepší využívat standardní výjimky! class MyException extends Exception { protected int pocetparametru; public MyException(int pocet) { pocetparametru = pocet; public int getpocetparametru() { return pocetparametru; Radek Kočí Seminář Java Výjimky 21/ 25

Ukázka vlastní výjimky a klauzule finally public static void main(string[] args) { int pocetparametru = args.length; try { if (pocetparametru < 2) throw new MyException(pocetParametru); System.out.println("Spravny pocet: " + pocetparametru); catch (MyException me) { System.out.println("Malo parametru: " + me.getpocetparametru()); finally { System.out.println("Konec"); Radek Kočí Seminář Java Výjimky 22/ 25

Reakce na výjimku Jak můžeme reagovat? Napravit příčiny vzniku chybového stavu např. znovu nechat načíst vstup Poskytnout za chybný vstup náhradu např. implicitní hodnotu Operaci neprovést ( vzdát ) a sdělit chybu výše tím, že výjimku propustíme z metody Výjimková pravidla: Vždy nějak reagujme! Neignorujme, nepotlačujme, tj. blok catch nenechávejme prázdný, přinejmenším vypišme e.printstacktrace() Nelze-li reagovat na místě, propusťme výjimku výše (a popišme to v dokumentaci...) Radek Kočí Seminář Java Výjimky 23/ 25

Ukázka nesprávného použití výjimky public static void main(string[] args) { try { otevri(args[0]); catch (ArrayIndexOutOfBoundsException e) { System.err.println("Neni zadan argument."); public static void main(string[] args) { if (args.length == 0) { System.err.println("Neni zadan argum."); return; otevri(args[0]); Radek Kočí Seminář Java Výjimky 24/ 25

Ukázka nesprávného použití výjimky try { int i = 0; while(true) { a[i++] = i; catch (ArrayIndexOutOfBoundsException e) { int length = a.length; for(int i = 0; i < length; ) { a[i++] = i; Radek Kočí Seminář Java Výjimky 25/ 25