Stáhnout prezentaci
Prezentace se nahrává, počkejte prosím
ZveřejnilValerie Macháčková
1
Počítače a programování 1
2
Obsah přednášky Výjimky - základní typy výjimek Způsoby zpracování výjimek
3
Výjimky Mechanismus výjimek v Javě umožňuje psát “bezpečné programy”, které dokáží reagovat na chybové stavy vzniklé za běhu programu. Výjimka (exception) – událost popř. vyjímečný stav, o kterém si přejeme, aby v našem programu nenastal (např. dělění nulou, chybně zadané vstupy). Ve většině případů se jedná o kritický stav který má bez ošetření za následek předčasné ukončení programu
4
Druhy výjimek Výjimky třídy Error – závažné chyby, které se mohou vyskytnout pouze v JVM, v našem programu na ně nereagujeme protože je stejně neumíme opravit (např. nedostatek paměti – výjimka OutOfMemoryError ) Výjimky třídy RuntimeException (asynchronní výjimky) – mohou se v běžícím programu vyskytnout kdekoliv, tento typ výjimek vyvolává JVM ( např. dělení nulou) – překladač nás nenutí na ně reagovat, ale můžeme, považujeme-li to za užitečné Výjimky třídy Exception (synchronní výjimky) - nemohou se vyskytnout kdekoliv ale pouze v souvislosti s voláním některých metod u kterých je zvýšená pravděpodobnost že se při jejich použití může vyskytnout chyba (obvykle vstupy a výstupy) – tento typ výjimek musíme zpracovat, jinak nelze program přeložit
5
Způsob ošetření výjimek Programátor může na výjimku reagovat jedním ze tří způsobů : Výjimku neumí (nebo nechce) ošetřovat – informaci o jejím výskytu předá nadřazené metodě Výjimku zachytí a kompletně ošetří v metodě ve které se vyskytla Výjimku částečně nebo kompletně ošetří v metodě a zároveň pošle informaci o jejím výskytu do nadřazené metody
6
Předání výjimky výše Používá se v případě, že se metoda “zříká odpovědnosti“ za zpracování výjimky nebo v případě že chceme informovat volající metodu že došlo k chybě Deklarace: v hlavičce metody pomocí klíčového slova throws Př. public static int ctiInt() throws NumberFormat{ …… } Pokud dojde během provádění metody ctiInt() k výjimce je metoda ukončena a výjimka předána výše do volající metody - ve většině případů do metody main, která ji musí ošetřit nebo předat do JVM
7
import java.io.*; public class Vyjimka { public static int ctiInt() throws IOException { byte[] pole = new byte[20]; String nacteno; int i; System.in.read(pole); nacteno = new String(pole).trim(); i = Integer.valueOf(nacteno).intValue(); return i; } public static void main(String[] args)throws IOException { System.out.print("Zadej pocet cihel: "); System.out.println("Cihel je: " + i); }
8
Ošetření výjimky K ošetření výjimky se používá konstrukce try-catch Blok try ( tzv chráněný úsek) obsahuje kód ve kterém se může vyskytnout výjimka, blok catch říká na jakou výjimku (a jakým způsobem) se bude reagovat Př. Kvadratická rovnice – ošetření vstupů import vstup.*; public class Kvadrat{ public static void main(String [] args) { double a=0,b=0,c=0; double d,re,im; int koef=0; boolean rd;
9
do { try { switch (koef) { case 0: System.out.print("Zadej a: "); a=VstupData.ctiInt(); koef++ ; case 1: System.out.print("Zadej b: "); b=VstupData.ctiInt(); koef++ ; case 2: System.out.print("Zadej c: "); c=VstupData.ctiInt(); } rd=true; } catch ( NumberFormatException e) { rd=false; System.out.println("Chybne zadane koeficienty !!! Zadej znovu "); } } while (!rd); System.out.println("a : "+a+"\t b : "+b+"\t c : "+c ); if ((a==0) && (b==0)) {
10
if (c!=0) System.out.println("Rovnice nema reseni."); else System.out.println("Rovnice ma nekonecne mnoho reseni."); } else { if ((a==0) && (c!=0)) System.out.println("Rovnice je linearni. c=" + (-c/b) ); else { d=Math.pow(b,2.)-4*a*c; if (d>=0) { System.out.println("x1="+ (-b+ Math.sqrt(d))/(2*a)); System.out.println("x2="+ (-b+ Math.sqrt(d))/(2*a)); } else { System.out.println("x1="+ (-b/(2*a)) + " + j" + Math.sqrt(Math.abs(d))/(2*a)); System.out.println("x2="+ (-b/(2*a)) + " + j" + Math.sqrt(Math.abs(d))/(2*a)); } }
11
Ošetření výjimky a předání výše Používá se v případech kdy chceme informovat volající metodu že došlo k chybě a nechceme vymýšlet speciální návratové hodnoty
12
import java.io.*; public class Vyjimka { public static int ctiInt() throws NumberFormatException { byte[] pole = new byte[20]; String nacteno; int i; try { System.in.read(pole); nacteno = new String(pole).trim(); i = Integer.valueOf(nacteno).intValue(); return i; } catch (IOException e) { System.out.println("Chyba pri cteni"); return 0; } catch (NumberFormatException e) { // System.out.println("Chyba pri cteni"); throw e; // vyhozeni vyjimky }
13
public static void main(String[] args) { boolean opak=false; do { try { System.out.print("Zadej pocet cihel: "); int i = ctiInt(); System.out.println("Cihel je: " + i); opak=false; } catch (NumberFormatException e) { System.out.println("Chybne zadany vstup, zadejte znovu !!! "); opak=true; } } while(opak); }
14
Minimální doporučená reakce na výjimku Výjimku je možné “chytit” a nereagovat na ni. V tomto případě bude blok catch prázdný. Tento způsob však není vhodný a neměl by se používat !!!!! Minimálně by měl blok catch obsahovat následující volání metody: catch (Jmeno_Vyjimky e ) { e.printStackTrace(); } Která vypíše informace o tom kde chyba nastala a co bulo příčinou chyby. (tj. totéž co se vypíše v případě když výjimku vyhodíme do JVM - např. java.lang.NumberFormatException: For input string: "hodne" at java.lang.NumberFormatException.forInputString(Unknown Source) at java.lang.Integer.parseInt(Unknown Source) at java.lang.Integer.valueOf(Unknown Source) at Vyjimka.ctiInt(Vyjimka.java:12) at Vyjimka.main(Vyjimka.java:31)
15
Seskupování výjimek a postupná selekce Pokud potřebujeme v daném bloku reagovat na více výjimek je možné použít více bloků catch za jedním příkazem try – pozor závisí na pořadí bloků – jakmile vzniklá výjimka vyhovuje třídě výjimek uvedené v catch tak se ostatní bloky neprohledávají. Př. try { ….. } catch (NumberFormatException e) { // zpracuje konkrétní výjimku třídy RuntimeException } catch (RuntimeException e) { // reaguje na zbývající výjimky této třídy }
16
Vyvolání výjimky Pokud chceme vyzkoušet zda náš program správně reaguje na výjimku je možné ji programově vyvolat (kdekoliv) příkazem throw Př. import java.io.*; public class Vyjimka { public static int ctiInt() throws IOException { byte[] pole = new byte[20]; String nacteno; int i;
17
try { System.in.read(pole); nacteno = new String(pole).trim(); i = Integer.valueOf(nacteno).intValue(); if (i == 0) throw new IOException(); return i; } catch (IOException e) { System.out.println("Chyba cteni"); throw e; }
18
public static void main(String[] argv) { System.out.print("Zadej pocet cihel: "); try { int i = ctiInt(); System.out.println("Cihel je: " + i); } catch (IOException e) { System.out.println("Program neprobehl spravne"); }
19
Konstrukce try-catch-finally Používá se tehdy, pokud chceme, aby se určitý úsek programu provedl jak v případě výjimky tak v případě normálního úseku programu. Syntaxe : try { // hlídaný blok } catch ( TypVýjimky ) { // ošetření výjimky } finally { // tento kód se provede vždy }
20
Try-catch-finally Blok finally se provádí i v případě, že v blocích try nebo catch je : příkaz return vyvolána jiná vyjimka Použití: uzavírání otevřených souborů ( v případě neuzavření souboru hrozí ztráta dat) Podobným způsobem funguje konstrukce try-finally
Podobné prezentace
© 2024 SlidePlayer.cz Inc.
All rights reserved.