A Java programozási nyelvSoós Sándor 1/24 Java programozási nyelv 9. rész – Kivételkezelés Nyugat-Magyarországi Egyetem Faipari Mérnöki Kar Informatikai.

Slides:



Advertisements
Hasonló előadás
C++ programozási nyelv Gyakorlat hét
Advertisements

3. A programozás eszközei, programozás-technikai alapismeretek
Gyakori hibák C# programozásban
Hibakezelés és Tesztelés a Visual Studio.NET-ben
Öröklődés 2..
JavaScript.
© Kozsik Tamás Beágyazott osztályok A blokkstrukturáltság támogatása –Eddig: egymásba ágyazható blokk utasítások Osztálydefiníciók is egymásba.
Bevezetés a Java programozásba
Fájlkezelés, IO Kivételkezelés Belső osztályok
UNIVERSITY OF SZEGED D epartment of Software Engineering UNIVERSITAS SCIENTIARUM SZEGEDIENSIS Programozás II. 9. Gyakorlat Alap file műveletek.
UNIVERSITY OF SZEGED D epartment of Software Engineering UNIVERSITAS SCIENTIARUM SZEGEDIENSIS Programozás II. 6. Gyakorlat const, static, dinamikus 2D.
Fejlett Programozási Technológiák II. Világos Zsolt 12. gyakorlat.
A Java programozási nyelvSoós Sándor 1/17 Java programozási nyelv 4. rész – Osztályok II. Nyugat-Magyarországi Egyetem Faipari Mérnöki Kar Informatikai.
A C++ programozási nyelvSoós Sándor 1/17 C++ programozási nyelv Gyakorlat - 7. hét Nyugat-Magyarországi Egyetem Faipari Mérnöki Kar Informatikai Intézet.
Java programozási nyelv 2. rész – Vezérlő szerkezetek
A C++ programozási nyelvSoós Sándor 1/14 C++ programozási nyelv Gyakorlat hét Nyugat-Magyarországi Egyetem Faipari Mérnöki Kar Informatikai Intézet.
A Java programozási nyelvSoós Sándor 1/16 Java programozási nyelv 6. rész – Java a gyakorlatban Nyugat-Magyarországi Egyetem Faipari Mérnöki Kar Informatikai.
Java programozási nyelv 3. rész – Osztályok I.
A Java programozási nyelvSoós Sándor 1/4 Java programozási nyelv 12. rész – Képek kezelése Nyugat-Magyarországi Egyetem Faipari Mérnöki Kar Informatikai.
A C++ programozási nyelvSoós Sándor 1/10 C++ programozási nyelv Gyakorlat - 5. hét Nyugat-Magyarországi Egyetem Faipari Mérnöki Kar Informatikai Intézet.
A C++ programozási nyelvSoós Sándor 1/15 C++ programozási nyelv Gyakorlat hét Nyugat-Magyarországi Egyetem Faipari Mérnöki Kar Informatikai Intézet.
A C++ programozási nyelvSoós Sándor 1/12 C++ programozási nyelv Gyakorlat - 8. hét Nyugat-Magyarországi Egyetem Faipari Mérnöki Kar Informatikai Intézet.
Java programozási nyelv 5. rész – Osztályok III.
JSP és JavaBean JavaServer Pages és Java Beans Fabók Zsolt Általános Informatikai Tanszék Miskolci Egyetem.
OE-NIK HP Haladó Programozás WCF kivételkezelés. OE-NIK HP Haladó Programozás Windows Communication Foundation A szolgáltatás, a hoszt és az ügyfél elkészítése.
© Kozsik Tamás Kivételek A program végrehajtása során ritkán bekövetkező események Nem a „fő végrehajtási ág”; logikailag alacsonyabbrendű feladat.
© Kozsik Tamás Csomagok. © Kozsik Tamás A program tagolása Típusdefiníciók (osztályok, interfészek) Metódusok Blokk utasítások Csomagok.
Programozás I Függvények általános jellemzői
ISZAM III.évf. részére Bunkóczi László
Kivételkezelés.
Kivételkezelés a C++ nyelvben Bevezetés
P ROGRAMOZÁS C# - BAN Kivételkezelés. P ÉLDA I. Nullával való osztás miatt kapjuk a hibaüzenetet.
Programozási nyelvek összehasonlító elemzése
1 Szoftvertechnológia alapjai Java előadások Förhécz András, doktorandusz tárgy honlap:
2012. tavaszi félév Vitéz Gergely. A diasor ismerete nem helyettesíti a tankönyvet, és a példatárat. A diasor ismerete szükséges, de nem elégséges feltétele.
Szintaktikai, szemantikai szabályok
1.3. Pascal program felépítése Az els ő program. Program ; … Begin … End. Program fej Deklarációs rész Végrehajtó rész.
1.4. Fordítás, szerkesztés, az objektumkönyvtár használata.
1 Hernyák Zoltán Programozási Nyelvek II. Eszterházy Károly Főiskola Számítástudományi tsz.
Hernyák Zoltán Programozási Nyelvek II.
1 Hernyák Zoltán Programozási Nyelvek II. Eszterházy Károly Főiskola Számítástudományi tsz.
1 Hernyák Zoltán Programozási Nyelvek II. Eszterházy Károly Főiskola Számítástudományi tsz.
1 Hernyák Zoltán Web: Magasszintű Programozási Nyelvek I. Eszterházy.
Hernyák Zoltán Programozási Nyelvek II.
Javascript Microsoft által készített kiegészítése Statikus típusosság Nagy projektek Windows 8 fejlesztésénél WinRT egy részét ebben írták Nyílt forráskódú,
1Szegedi Tudományegyetem Természettudományi és Informatikai KarAntal Gábor Programozás I. 7. gyakorlat.
Java programozási nyelv Metódusok
Java programozási nyelv Adatbekérés konzolról
Webprogramozó tanfolyam
HTML ÉS PHP (Nagyon) rövid áttekintés. ADATBÁZISRENDSZEREK MŰKÖDÉSI SÉMÁJA Felh. interakció DB Connector MySQL ? A gyakorlaton:
Programozás III KIVÉTEL.
Török Katalin és Marosi Nóra 11/c. Pascal: Az es években megjelent magas szintű programozási nyelv, közel áll az emberi gondolkodáshoz. Nevét.
Programozás III KIVÉTEL. KIVÉTELKEZELÉS Hibátlan program nincs!!! eddig hiba esetén leállt a program. Példa ilyen hibákra: ─ ArrayBoundsOfException (tömb.
Ficsor Lajos CPP2 / 1 Származtatási mechanizmus a C++ nyelvben Ficsor Lajos Miskolci Egyetem Általános Informatikai Tanszék.
UNIVERSITY OF SZEGED D epartment of Software Engineering UNIVERSITAS SCIENTIARUM SZEGEDIENSIS Programozás I. 7. gyakorlat.
Adatszerkezetek és algoritmusok 2008/ Algoritmus Az algoritmus szó eredete a középkori arab matematikáig nyúlik vissza, egy a i.sz. IX. században.
TÁMOP /1-2F Informatikai gyakorlatok 11. évfolyam Kivételek kezelése, ellenőrzött adatbevitel Czigléczky Gábor 2009.
Programozás III ÖTLETEK A FELADATMEGOLDÁSHOZ. A HF-EK APROPÓJÁN Néhány javaslat: 1. Jó lenne, ha a feladatmegoldás előtt átnéznék az előadás-anyagokat.
1Szegedi Tudományegyetem Természettudományi és Informatikai KarAntal Gábor Programozás I. 7. gyakorlat.
TÁMOP /1-2F JAVA programozási nyelv NetBeans fejlesztőkörnyezetben I/13. évfolyam Utasítás és blokk. Elágazás típusai, alkalmazása Kovács.
A szoftver mint komplex rendszer: objektumorientált megközelítés.
Script nyelvek előadás
Programozási nyelvek típusossága.
Hernyák Zoltán Programozási Nyelvek II.
Programozás C# -ban Elágazások.
Hernyák Zoltán Magasszintű Programozási Nyelvek I.
JAVA programozási nyelv NetBeans fejlesztőkörnyezetben I/13. évfolyam
Informatikai gyakorlatok 11. évfolyam
Informatikai gyakorlatok 11. évfolyam
Informatikai gyakorlatok 11. évfolyam
Előadás másolata:

A Java programozási nyelvSoós Sándor 1/24 Java programozási nyelv 9. rész – Kivételkezelés Nyugat-Magyarországi Egyetem Faipari Mérnöki Kar Informatikai Intézet Soós Sándor szeptember

A Java programozási nyelvSoós Sándor 2/24 Tartalomjegyzék ● Mit nevezünk kivételkezelésnek? ● Kivétel keletkezése ● Kivétel kiváltásának típusai ● A megfelelő kivételkezelő keresése ● A kivétel elkapása (catching exception) ● A kivétel kiváltása Java-ban ● A kivétel elkapása Java-ban ● A finally blokk ● Kivételek specifikálása ● Klasszikus példa a Java nyelv specifikációjából

A Java programozási nyelvSoós Sándor 3/24 Mit nevezünk kivételkezelésnek? ● Szűkebb értelemben: – A programban fellépő futásidejű hibák kezelését. ● Tágabb értelemben: – A program normál logikájához képest különleges, attól eltérő helyzetek kezelését. – Ez azt is jelenti, hogy abszolút nem hibás esetek kezelését is megoldhatjuk a kivételkezelés mechanizmusával. ● A végső cél: – Teljes egészében kezünkben tartsuk a program működését, minden helyzetben a szándékaink szerint reagáljon a program. Soha ne forduljon elő olyan eset, amikor a program úgy fejeződik be, hogy valamit "elvarratlanul" hagyott.

A Java programozási nyelvSoós Sándor 4/24 Miért fontos ez? ● Milyen problémákat okozhat egy rendkívüli program leállás? – adatvesztés: ● nyitva maradt fájlok ● még el nem mentett, berögzített adat. A felhasználó begépelt 5 oldalnyi szöveget, amikor a program "elszáll", vagy hibajelzéssel leáll. – időveszteség: ● egy 5 órája futó kalkuláció a végeredmény elkészülte és a részeredmények elmentése nélkül hibajelzéssel leáll. – erőforrások fogvatartása ● a program futása során lefoglal bizonyos erőforrásokat (fájlok, adatbázis rekordok), ezeket a futás végén szabadítaná fel. – pl. kórházi rendszer, lefagy a terminál, zárolt marad a rekord

A Java programozási nyelvSoós Sándor 5/24 Mi a megoldás? ● A programot fel kell készíteni minden eshetőségre. ● Például: Egy egyszerű program: program { fuggveny1(); fuggveny2(); fuggveny3(); } Egy egyszerű program: program { fuggveny1(); fuggveny2(); fuggveny3(); } Az előző program hibakezeléssel: program { if (fuggveny1() = OK) { if (fuggveny2() = OK) { if (fuggveny3() = OK) { // minden rendben } else { // hibakezelés3 } } else { // hibakezelés2 } } else { // hibakezelés1 } } Az előző program hibakezeléssel: program { if (fuggveny1() = OK) { if (fuggveny2() = OK) { if (fuggveny3() = OK) { // minden rendben } else { // hibakezelés3 } } else { // hibakezelés2 } } else { // hibakezelés1 } } Miért nem jó ez?

A Java programozási nyelvSoós Sándor 6/24 Miért nem jó ez a megoldás? ● A hibakezelés elrejti, széttördeli az eredeti programlogikát: – nehezen olvasható kód – nehezen javítható, módosítható a kód ● A hibakezelő programrésznek nincs információja a hiba jellegéről, okáról ● Nagyobb programok esetén ez a megoldás kivitelezhetetlen, sőt... – hiba bekövetkezhet a hibakezelő programrészben is, ezért oda is kellene ellenőrzés,...

A Java programozási nyelvSoós Sándor 7/24 A szép megoldás class Exception1 extends Exception {} class Exception2 extends Exception {} class Exception3 extends Exception {} Pogram() { try { fuggveny1(); fuggveny2(); fuggveny3(); } catch(Exception1 hiba1) { /* hibakezelés1 */ } catch(Exception2 hiba2) { /* hibakezelés2 */ } catch(Exception3 hiba3) { /* hibakezelés3 */ } }

A Java programozási nyelvSoós Sándor 8/24 A kivételkezelés ötlete ● Válasszuk szét az eredeti programlogikát és a kivételes helyzetek (hibaállapotok) kezelését ● A kivételkezelő kapjon információt a hiba típusáról, helyéről és egyéb körülményeiről ● A kivételkezelő legyen képes visszatérni az eredeti programlogikához, ha a hiba jellege ezt lehetővé teszi. ● Legyen lehetőség garantálni a program és minden részprogram korrekt befejeződését bármilyen körülmények fennállása esetén (fájlok bezárása, erőforrások felszabadítása, stb.)

A Java programozási nyelvSoós Sándor 9/24 Kivételkezelés a Java-ban ● Ezeket az elveket különböző módokon valósítják meg a különböző programnyelvek (C++, Ada, Eiffel, Object Pascal – Delphi) ● A Java ezt is teljes mértékben osztályokkal valósítja meg. ● A kivételeket is beépíti az osztályhierarchiába. ● A kivételek csak annyiban kivételesek, hogy ők "kiválthatóak", míg a többi osztály nem.

A Java programozási nyelvSoós Sándor 10/24 Kivétel keletkezése ● Amikor valamilyen hiba lép fel egy metódus végrehajtása során (vagy a programozó külön útra kívánja terelni a végrehajtást), akkor – létrejön egy kivétel objektum – A "hiba" adatai és a program állapota rögzítésre kerül a kivétel objektumban – Az objektum a Java Virtuális Gép felügyelete alá kerül. ● Ezt nevezzük a kivétel kiváltásának (throwing exception) ● Ekkor a blokk futása megszakad, oda már nem kerül vissza a vezérlés.

A Java programozási nyelvSoós Sándor 11/24 Kivétel kiváltásának típusai ● Kivétel háromféleképpen keletkezhet: – A program futása közben valamilyen rendellenes dolog történt: nullával osztás, erőforrások elfogyása, osztálybetöltési hiba, stb. – A program végrehajtott egy throw utasítást. Ezt megteheti valamely Java könyvtári osztály, vagy maga a programozó – Egy aszinkron kivétel lépett fel. Ez akkor következhet be, amikor a program több szálon fut és egy másik szál futása megszakad. Ezzel most nem foglalkozunk.

A Java programozási nyelvSoós Sándor 12/24 A megfelelő kivételkezelő keresése ● A kivétel kiváltása után a JVM megkeresi a megfelelő kivételkezelő kódblokkot. ● Egy kivételkezelő kódblokk akkor megfelelő, ha – a hatáskörében keletkezett a kivétel – a típusa megfelelő a kiváltott kivételhez. – A típus akkor megfelelő, ha ● vagy a kezelő által kezelt kivétel típusa azonos a kivételével ● vagy az őse annak – A blokkok egymásba ágyazása miatt több alkalmas kezelő is lehet. Ezek közül a legbelsőt választja a JVM. ● Ezt nevezzük a kivétel elkapásának (catching exception)

A Java programozási nyelvSoós Sándor 13/24 A kivétel elkapása (catching exception) ● A megfelelő kivételkezelő blokk megtalálásakor a JVM átadja a vezérlést a kiválasztott kezelőnek ● Lefut a blokk ● A kivételkezelő blokk lefutása után a kezelő blokk utáni utasításra kerül a vezérlés. ● A kivételkezelés közben is kiváltódhat kivétel, ekkor a blokk végrehajtása megszakad, és ugyanaz lezajlik, mint az előbb. ● Ha a JVM nem talál alkalmas kivételkezelő blokkot, akkor megszakad a program futása, (legalábbis az egyszálú programok esetében.)

A Java programozási nyelvSoós Sándor 14/24 Konkrét példa ● Bevezetésképpen nézzünk meg egy konkrét példát! – A Verem.java fájlban látjuk egy verem adattípus részletét – A VeremTeszt.java fájlban pedig kipróbáljuk ezt a verem típust.

A Java programozási nyelvSoós Sándor 15/24 A kivételkezelés megvalósítása Java-ban ● A Java nyelv a következő utasításokat nyújtja a kivételkezeléshez: – throw: kivétel kiváltása – try-catch-finally: kivételkezelő blokk meghatározása – throws: kivételek specifikálása

A Java programozási nyelvSoós Sándor 16/24 A kivétel kiváltása Java-ban ● Vagy a Virtuális Gép, vagy egy metódus válthatja ki a kivételt (throw utasítás). ● A throw paramétereként egy kivételosztályt kell megadni. Például: class UjException extends Exception { } throw new Exception( "Hiba történt!” ); throw new UjException(); ● A throw paramétereként csak olyan objektumot lehet megadni, ami kiváltható, azaz az osztálya a java.lang.Throwable osztály leszármazottja.

A Java programozási nyelvSoós Sándor 17/24 A kivétel elkapása Java-ban ● A kivételek elkapásához a vizsgálni kívánt utasításokat egy try blokkba kell tenni: try { // Java utasítások } ● A try blokkban lévő utasításokat figyeli a JVM kivételek keletkezése szempontjából. ● Rajtunk múlik, hogy mekkora blokkokat alakítunk ki, tehetünk minden utasítást külön blokkba, vagy mindet egybe, és ezek között tetszőleges átmenet használható.

A Java programozási nyelvSoós Sándor 18/24 A kivétel elkapása, folyt. ● A try blokkban kiváltott kivételeket az utána következő catch blokk, vagy blokkok kezelik le: try { // java utasítások } catch(Típus1 változó1) { /* Java utasítások */ } catch(Típus2 változó2) { /* Java utasítások */ } catch(Típus3 változó3) { /* Java utasítások */ } ● Minden catch ágban a "paraméterként" megadott típus határozza meg, hogy mely kivételeket képes lekezelni.

A Java programozási nyelvSoós Sándor 19/24 A catch ágak sorrendje ● A catch ágak sorrendje fontos, mert a megadott sorrendben keresi a JVM a megfelelő kezelőt. ● A kivételosztályok egymásra épülése miatt több blokk is alkalmas lehet. Ezek közül az elsőt választja a JVM. ● A Java fordítási hibát jelez, ha biztosan el nem érhető kódot talál. Ez a tény befolyásolja a catch ágak lehetséges sorrendjét.

A Java programozási nyelvSoós Sándor 20/24 A finally blokk ● Az utolsó catch blokk után megadható egy finally blokk. Az ebbe írt utasítások mindenképpen lefutnak, akkor is, ha – nem lépett fel kivétel – a kivételt valamelyik catch blokk lekezelte – a kivételt egyik catch ág sem tudta lekezelni nem megfelelő típus miatt. Ekkor a hívó metódus kivételkezelő blokkjához kerül a vezérlés, de előtte lefut a finally blokk ● Nézzük meg a FinallyTest.java példát!

A Java programozási nyelvSoós Sándor 21/24 Egy teljes kivételfigyelő blokk try { // java utasítások } catch(Típus1 változó1) { /* Java utasítások */ } catch(Típus2 változó2) { /* Java utasítások */ } catch(Típus3 változó3) { /* Java utasítások */ } //... finally { /* Java utasítások */ } ● A try blokk után kötelezően következnie kell legalább egy catch vagy finally blokknak. Ha mindkettő van, akkor catch – finally sorrendben kell megadni őket.

A Java programozási nyelvSoós Sándor 22/24 Kivételek specifikálása ● Ha a programozó úgy dönt, hogy egy kivételt nem akar lekezelni az adott metódusban, hanem egy közvetett, vagy közvetlen hívójára hagyja azt, akkor a metódus fejében specifikálnia kell azt a throws kulcsszóval. metódus() throws Exception1, Exception2,... { //... } ● Ha a metódus nem kezeli le a specifikált kivételt, akkor a JVM egy szinttel feljebb keres alkalmas kezelőt.

A Java programozási nyelvSoós Sándor 23/24 Mikor érdemes specifikálni egy kivételt? ● Van olyan eset, amikor a kivételt nem a kiváltó metódus szintjén lehet lekezelni, hanem feljebb. ● Például ha tele van a verem, akkor azt nem a verem tudja kezelni, hanem a vermet használó osztály. ● Ezért a Betesz metódus ne kezelje le a kivételt, hanem specifikálja azt.

A Java programozási nyelvSoós Sándor 24/24 Klasszikus példa a Java nyelv specifikációjából ● Nézzük meg a Teszt.java programot! ● Aki megértette a program működését, az valóban érti a Java kivételkezelő mechanizmusát.