Informatika a felsőoktatásban 2008 Debrecen, augusztus A JAVA NYELV KIVÉTEL- ÉS ESEMÉNYKEZELÉSÉNEK BEMUTATÁSA AZ OKTATÁSBAN

Hasonló dokumentumok
Objektum Orientált Programozás. 11. Kivételkezelés 44/1B IT MAN

Kivételkezelés, beágyazott osztályok. Nyolcadik gyakorlat

Objektumorientált programozás Pál László. Sapientia EMTE, Csíkszereda, 2014/2015

Programozási technológia

Java Programozás 11. Ea: MVC modell

7. K: JAVA alapok Konzultáció

Grafikus felhasználói felületek. Dr. Szendrei Rudolf Informatikai Kar Eötvös Loránd Tudományegyetem. Programozási technológia I. Dr.

Két csomag elemeiből lehet a felületet elkészíteni: awt: heavy weight komponensek; swing: light weight komponensek (időben később).

Java programozási nyelv 9. rész Kivételkezelés

Az osztályok csomagokba vannak rendezve, minden csomag tetszőleges. Könyvtárhierarhiát fed: Pl.: java/util/scanner.java

Java II. I A Java programozási nyelv alapelemei

Adatbázis alapú rendszerek gyakorlat Adatbázis alapú alkalmazásfejlesztés Java, C# környezetben

Helyes-e az alábbi kódrészlet? int i = 1; i = i * 3 + 1; int j; j = i + 1; Nem. Igen. Hányféleképpen lehet Javaban megjegyzést írni?

Java Programozás 5. Gy: Java alapok. Adatkezelő 1.rész

Grafikus felhasználói felületek. Abstract Window Toolkit, a java.awt és java.awt.event csomagok

Kivételek kezelése (exception handling) Hibakezelés old style. Kivételkezelés

Java felhasználói felület

és az instanceof operátor

Java VIII. Az interfacei. és az instanceof operátor. Az interfészről általában. Interfészek JAVA-ban. Krizsán Zoltán

Java IX. telkezelés a Java-ban

Java Programozás 4. Gy: Java GUI. Tipper, MVC kalkulátor

Java IX. telkezelés a Java-ban

Programozás I. 3. gyakorlat. Szegedi Tudományegyetem Természettudományi és Informatikai Kar

3. Osztályok II. Programozás II

Java II. I A Java programozási nyelv alapelemei

Szoftvertechnológia alapjai Java előadások

JAVA PROGRAMOZÁS 5.ELŐADÁS

1. Jelölje meg az összes igaz állítást a következők közül!

Programozási technológia

Programozási nyelvek JAVA EA+GY 1. gyakolat

OOP: Java 8.Gy: Abstract osztályok, interfészek

abkezel.java import java.awt.*; import java.awt.event.*; import javax.swing.*; import java.sql.*; public class abkezel extends JFrame {

Objektumorientált programozás C# nyelven

Java programozási nyelv 6. rész Java a gyakorlatban

Swing GUI készítése NetBeans IDE segítségével

Programozási nyelvek Java

OOP #14 (referencia-elv)

Kivételek, kivételkezelés a C++ nyelvben

Osztályok. construct () destruct() $b=new Book(); $b=null; unset ($b); book.php: <?php class Book { private $isbn; public $title;

Grafikus felhasználói felületek, eseménykezelés

Kivételkezelés, naplózás. Exception handling, logging

Java Programozás 3. Gy: Java GUI. Swing, AWT

C# nyelv alapjai. Krizsán Zoltán 1. Objektumorientált programozás C# alapokon tananyag. Általános Informatikai Tanszék Miskolci Egyetem

Java Programozás 8. Gy: Java alapok. Adatkezelő 4.rész

A C# programozási nyelv alapjai

Szoftvertechnológia alapjai Java előadások

OBJEKTUM ORIENTÁLT PROGRAMOZÁS JAVA NYELVEN. vizsgatételek

Pénzügyi algoritmusok

Objektumorientált programozás C# nyelven

Informatika terméktervezőknek

Java Programozás 6. Gy: Java alapok. Adatkezelő 2.rész

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 jelzése

Széchenyi István Egyetem. Programozás III. Varjasi Norbert

Számítástechnika II. BMEKOKAA Előadás. Dr. Bécsi Tamás

AWK programozás, minták, vezérlési szerkezetek

JAVA PROGRAMOZÁS 3.ELŐADÁS

Változók. Mennyiség, érték (v. objektum) szimbolikus jelölése, jelentése Tulajdonságai (attribútumai):

Eseménykezelés. Szoftvertervezés és -fejlesztés II. előadás. Szénási Sándor.

Már megismert fogalmak áttekintése

Java programozási nyelv 5. rész Osztályok III.

Kivételkezelés a C++ nyelvben Bevezetés

A JavaScript főbb tulajdonságai

Szerző. Varga Péter ETR azonosító: VAPQAAI.ELTE cím: Név: Kurzuskód:

JUnit. JUnit használata. IDE támogatás. Parancssori használat. Teszt készítése. Teszt készítése

Bevezetés a programozásba Előadás: Objektumszintű és osztályszintű elemek, hibakezelés

Programozási nyelvek Java

Globális operátor overloading

Java és web programozás

Objektumorientált programozás C# nyelven

AWK programozás, minták, vezérlési szerkezetek

Osztályok. 4. gyakorlat

Concurrency in Swing

Programozási technológia

JAVA PROGRAMOZÁS 2.ELŐADÁS

Programozási nyelvek II. JAVA EA+GY 1. gyakolat

A gyakorlat során az alábbi ábrán látható négy entitáshoz kapcsolódó adatbevitelt fogjuk megoldani.

Java programozási nyelv 4. rész Osztályok II.

Objektumorientált programozás C# nyelven III.

OOP: Java 8.Gy: Gyakorlás

Imperatív programozás

C++ programozási nyelv

Java Programozás 7. Gy: Java alapok. Adatkezelő 3.rész

Johanyák Zsolt Csaba: Ugráló gomb oktatási segédlet Copyright 2008 Johanyák Zsolt Csaba

Java bevezet o Kab odi L aszl o Kab odi L aszl o Java bevezet o

Java felhasználói felület

Swing. (A javax.swing csomag)

Programozás I. Első ZH segédlet

BME MOGI Gépészeti informatika 4.

S ha kettészelik is: balfelöl belőle Valamivel mindig - Valamivel mindiq több marad. (Nyugat )

Osztályszintű elérés, kivételkezelés, fájlkezelés

Java Programozás 1. Gy: Java alapok. Ismétlés ++

Tömbök kezelése. Példa: Vonalkód ellenőrzőjegyének kiszámítása

Tájékoztató. Használható segédeszköz: -

Occam 1. Készítette: Szabó Éva

Programozási technológia I.

Bevezetés a programozásba I.

Bevezetés a Python programozási nyelvbe

Java Programozás 9. Gy: Java alapok. Adatkezelő 5.rész

Programozási nyelvek (ADA)

Programozás II. 4. Dr. Iványi Péter

Átírás:

A JAVA NYELV KIVÉTEL- ÉS ESEMÉNYKEZELÉSÉNEK BEMUTATÁSA AZ OKTATÁSBAN DEMONSTRATING OF EXCEPTION HANDLING AND EVENT HANDLING IN EDUCATION BY JAVA Seres Iván, Kaczur Sándor Gábor Dénes Főiskola Informatikai Intézet Összefoglaló A hallgatók rendszerint nincsenek tisztában a kivétel- és eseménykezelés részleteivel (milyen objektumok keletkeznek, hol keletkeznek, hogyan jutnak el az őket később kezelő metódusokhoz vagy blokkokhoz). Cikkünkben kísérletet teszünk arra, hogy a kivétel- és eseménykezelés folyamatát szemléletessé, mintegy kézzelfoghatóvá tegyük rövid, de célra törő forráskódok, a BlueJ oktatószoftver, valamint a JBuilder fejlesztőeszköz segítségével. Bemutatjuk, hogyan keletkeznek a kivételek, hogyan lehet szándékosan kiváltani, továbbadni, lekezelni azokat, hogyan értelmezhető élettartamuk. Kulcsszavak objektumorientált programozás, kivételkezelés, eseménykezelés, Java Abstract Usually students do not know details of exception handling and event handling. (What sort of objects can be rise? Where do objects rise? How do objects be thrown to the handling methods or block?) In this article we make an attempt at make clear the process of the exception handling and event handling. We use short source codes, tutorial program BlueJ, and development tool JBuilder. We demonstrate how exceptions can be risen, how to give rise to exceptions, how exceptions can be thrown, how exceptions can be handled, what the lifetime of exception is. Keywords object-oriented programing, exception handling, event handling, Java 1

1. Bevezetés A korszerű objektumorientált nyelveken fejlesztett programok működése eseményorientált. A programot objektumok kommunikációja, üzenetküldése működteti. A program futása felhasználói (belső) vagy más programok, erőforrások (külső) beavatkozásaitól, azaz eseményektől függ. Az események szintek alapján is csoportosíthatók: az alacsony szintűek a hardver felől érkező megszakítások, magas szintűek a felhasználói tevékenységek (pl.: kattintás, görgetés, adatok megváltozása, űrlapok megnyitása). Az esemény hatással van a program futására, bekövetkezése megváltoztathatja valamely objektum állapotát. Az eseményorientált programozás eseménybegyűjtő és szétosztó mechanizmuson alapszik. Ennek működése egy olyan elöltesztelő ciklusként értelmezhető, amelynek ciklusmagjában kiolvassuk az események várakozó sorába került eseményt, majd továbbítjuk az eseménykezelőnek. Egy-egy eseményhez hozzárendelhető egy-egy eseménykezelő metódus, amely reagál arra. A kivétel lehet esemény, feltétel, vagy hibás állapot, amely bekövetkezése esetén a program normális működése megszakad. A kivétel egy hibaobjektum, amely a program futása során létrejön, feldolgozásra kerül, végül megszűnik. A kivételre a kivételkezelő reagál. A korszerű nyelvek esetén egy-egy eljárást, függvényt az általánosan kedvező esetre írunk meg, majd a metódus végén felsoroljuk azon hibalehetőségeket, amelyekre figyelni kell. Az így készített forráskód áttekinthetőbb, mintha közben vizsgálnánk az esetleges előforduló hibákat. Ha kódolás közben elkövethetünk szintaktikai hibát, akkor a forráskód nem fordítható le, mivel nem felel meg a programozási nyelv szabályrendszerének. Ha a tervezéskor vagy a kódoláskor szemantikai hibát vétünk, akkor a forráskód lefordítható, a program elindul, csupán nem a várt, kívánt rész- vagy végeredményt adja. Futási hiba esetén kezelni kell a keletkező hibát, és fel kell szabadítani a hiba bekövetkezését megelőzően lefoglalt erőforrásokat. A kivételkezelés további védelmet is nyújthat, védhet az előre nem várt, a felhasználótól, erőforrás rendelkezésre állásától függően keletkező problémáktól. Segítségével elérhető, hogy a felhasználónak a szoftver a beállított nyelven üzenje meg a problémát, adjon beavatkozási lehetőséget, a program futása folytatódhat is. A Java nyelvben a kivételek a Throwable osztály leszármazottai. A RuntimeException közvetlen leszármazottból futási hiba keletkezésekor (pl.: tömb túlindexelése), az IO- Exception-ből pedig beviteli/kiviteli problémák esetén (pl.: nem létező fájl megnyitása) jön létre objektum. A kivételek szándékosan is kiválthatók a throw utasítással, amely után csak a java.lang.throwable osztály leszármazottja írható. Az esemény is objektum, a kivételhez hasonlóan. A forrásobjektumon keletkezik; másképp a forrásobjektum kapja meg feldolgozásra, majd továbbítja az eseményfigyelőnek. Eseményfigyelő egyszerre több is lehet. Az alacsonyszintű eseményeket az operációs rendszer egy eseményekhez rendelt várakozó sorban helyezi el (pl.: billentyűzet, egér, ablak események), ezek forrása vizuális komponens. A várakozó sor meghatározza sorrendiségüket. Esemény csak olyan látható komponensen keletkezhet, amely része az alkalmazás komponenshierarchiájának. Minden mást magasszintű eseménynek tekintünk (pl.: akció-, igazítási esemény). A Java nyelvben az eseményobjektumok az EventObject osztályból származnak. A Swing komponensek eseményeit a javax.swing.event és a java.awt.event csomag definiálja. 2

2. Példák Az alábbiakban a Notepad++, a BlueJ eszközt, valamint a JBuilder fejlesztőeszközt felhasználva egyszerű mintapéldákkal mutatjuk be a kivétel- és eseménykezelés lehetőségeit. Az első két eszköz szabadon letölthető: http://notepad-plus.sourceforge.net/hu/site.htm, http:// www.bluej.org, a harmadik telepítőanyagát pedig főiskolánk hallgatói a félévenként kiosztásra kerülő oktatócsomagban megkapják. A példák megoldásához az 1.4.2_01-es, illetve az 1.6. 0_05-ös Java virtuális gépet használtuk. 2.1. Nullával való osztás A probléma tipikus. A kód szintaktikailag helyes, szemantikailag hibás, fordítása hiba nélkül megtörténik, futáskor ArithmeticException osztályú kivétel keletkezik. int a=5; int b=0; System.out.println(a/b); A legegyszerűbb kipróbálási lehetőség a Notepad++ eszközben adódik: az F5-re megjelenő Futtatás ablakába a cmd parancsot beírva parancssorból fordítható a forrásfájl és futtatható a bináris bájtkód. 1. ábra A nullával való osztás mintaprogramja a Notepad++ eszközben 3

2.2. Előjeles végtelen eredmény Ha két lebegőpontos formában tárolt valós számot osztunk egymással, és az osztó 0, akkor az Infinity (előjeles végtelen) eredményt kapjuk. Kivétel nem keletkezik. double a=1.0, b=0.0; System.out.println(a/b); 2.3. Nem szám eredmény Amikor negatív számot adunk a négyzetgyökvonó függvénynek paraméterként, akkor a NaN (Not A Number) üzenetet adja. Kivétel nem keletkezik. int x=-1; System.out.println(Math.sqrt(x)); 2.4. Tömb túlindexelése Az n(>0) elemű tömb érvényes tömbindexe 0 és n-1 közötti egész szám. Ha n=100, és a for ciklus feltételében a ciklusváltozó megegyezhet a 100-zal, akkor a Java virtuális gép a kezdőértékként kapott nullákat követően az ArrayIndexOutOfBoundsException osztályú kivételt váltja ki. static int[] tomb=new int[100]; for(int i=0; i<=100; i++) System.out.println(tomb[i]); Ha a tömbelemek felveszik az index értékét, és a keletkezett kivételobjektumnak lekérdezzük az osztályát és annak paraméterét (üzenetét), akkor az utolsó érvényes 99-es értéket követően a: Kivétel: class java.lang.arrayindexoutofboundsexception, Üzenet: 100 sort kapjuk a virtuális géptől. static int[] tomb=new int[100]; try { for (int i=0; i<=100; i++) System.out.println(tomb[i]=i); catch (Exception ex) { System.out.println("Kivétel: "+ex.getclass()+ ", Üzenet: "+ex.getmessage()); 4

A getclass() függvény a kivételobjektum osztályát, a getmessage() függvény pedig annak konstruktorban külön beállítható detailmessage szöveges leírását adja vissza. 2. ábra A tömb túlindexelés mintaprogramjának nyomkövetése a JBuilder eszközben A JBuilder fejlesztőeszköz képes a dinamikusan létrejövő ex kivételobjektumot azonosítani, leszármazottságát bemutatni, a kivétel helyét a forráskódban megjelölni, üzenetének felépítését megmutatni. Erre az eszköz Debug projekt menüpontja használható. Kivétel keletkezése esetén a JBuilder az alábbi hibaüzenet adja: 3. ábra A JBuilder eszköz hibaüzenete kivétel esetén Ha for ciklus belépési feltételét kicseréljük i<=tomb.length-re, akkor is az előző kivételobjektum keletkezik. A tömb -1-edik elemére hivatkozva is az előző üzenetet kapjuk. A tömb másfeledik elemére történő hivatkozás viszont már fordításkor hibát ad. Ha érvényes indexű tömbelemben nem egész valós számot szeretnénk tárolni, akkor konstans értékadáskor fordítási hibát, konzolról beolvasva futási hibát kapunk. 5

static int[] tomb=new int[100]; for(int i=0; i<=100; i++) { try{ System.out.println(tomb[i]=i); catch(arrayindexoutofboundsexception ex) { throw new ArrayIndexOutOfBoundsException ("Érvénytelen tömbindex: "+i); Ha a kivételt elkapjuk, paramétere jelzi a hiba okát: Exception in thread "main" java.lang.arrayindexoutofboundsexception: Érvénytelen tömbindex: 100 at Kivetel.main (Kivetel.java:11). Ha több kivételt kell lekezelni, akkor több catch is alkalmazható. Ekkor a sorrend számít: haladjunk a speciális eset lekezelésétől az általános eset felé. A BlueJ eszközben projekt tartalmazza a Kivetel osztályt, a forráskódja szerkeszthető. Ha lefordítjuk, és létrejön belőle az objektum, akkor a forráskódot futtatva, a kivétel keletkezésekor megtekinthetők az objektum statikus adatai. Látható, hogy a tömb létrejön, feltöltődik, elemszáma 100, megjelenik a paraméterezett kivételüzenet is. 4. ábra A tömb túlindexelés mintaprogramjának nyomkövetése a BlueJ eszközben 6

A keletkezett kivételobjektum élettartama a catch blokkra korlátozódik. Ha megpróbálunk pl. a getclass() metódussal üzenni neki a try-catch-finally blokkon kívül, akkor a fordító az <identifier> expected hibaüzenettel leáll. Sajnos a BlueJ eszköz nem képes megjeleníteni a dinamikusan létrejövő objektumok adatait, tulajdonságait. 2.5. Háromszög megszerkeszthetősége Három megegyező mértékegységgel megadott szakaszból mikor szerkeszthető háromszög? Amikor teljesül a háromszög-egyenlőtlenség. Feltételezzük, hogy az a, b, c változók mértékegysége megegyezik. Számoljuk ki a háromszög területét Héron-képlettel, ha lehetséges! Hagyományos ellenőrzése történhet az alábbiak szerint. double a=5, b=10, c=4; boolean haromszoge=(a+b>c)^(a+c>b)^(b+c>a); if (haromszoge) { System.out.println("A három szakasz háromszöget alkot."); double s=(double)(a+b+c)/2; double terulet=math.sqrt(s*(s-a)*(s-b)*(s-c)); System.out.println("A háromszög területe: "+terulet); else System.out.println("A három szakasz nem alkot háromszöget."); Hozzunk létre saját kivételobjektumot, ha háromszög nem szerkeszthető: Exception in thread "main" java.lang.runtimeexception: A három szakasz nem alkot háromszöget. at Kivetel.main(Kivetel.java:7) double a=5, b=10, c=4; if (!((a+b>c)^(a+c>b)^(b+c>a))) throw new RuntimeException("A három szakasz nem alkot háromszöget."); Ha statikus osztályváltozóként hozzuk létre a valós oldalak hosszát, az oldalak vizsgálatának eredményét tartalmazó logikai, valamint a nem_megszerkesztheto logikai változókat, akkor a BlueJ eszköz meg tudja mutatni ezek értékét a kivétel keletkezésekor. static double a=5, b=10, c=4; static boolean a_plusz_b_nagyobb_mint_c=a+b>c, a_plusz_c_nagyobb_mint_b=a+c>b, b_plusz_c_nagyobb_mint_a=b+c>a, nem_szerkesztheto=!(a_plusz_b_nagyobb_mint_c ^ a_plusz_c_nagyobb_mint_b ^ b_plusz_c_nagyobb_mint_a); if (nem_szerkesztheto) throw new RuntimeException("A három szakasz nem alkot háromszöget."); 7

5. ábra A háromszög megszerkeszthetőség mintaprogramjának nyomkövetése a BlueJ eszközben 2.6. Nyomógombok azonosítása Az eseménykezelés alapja, hogy azonosítani tudjuk az esemény kiváltóját, forrását, vagyis azt, hol keletkezett, honnan származik az esemény. A mintapélda szövegmező komponensébe attól függően, hogy melyik nyomógombra kattintottunk, beíródik a nyomógomb feliratát is tartalmazó szöveg. A figyelő nevű figyelőobjektumot a láncra ciklus fűzi fel, és az esemény bekövetkezésekor az eseményt kiváltó objektumot nyomógombbá típuskényszerítve kapjuk meg annak feliratát, majd abból konkatenáljuk a megfelelő paraméterszöveget. 6. ábra A Gombok program felhasználói felülete A gombok lenyomásakor keletkezik az ev akcióesemény, amelynek forrása az aktuális nyomógomb. A keletkezett eseményt a figyelő objektum dolgozza fel. Az addaction- Listener metódussal rendeljük hozzá a forrásobjektumhoz; vagyis a JButton osztály deklarálja a metódust. Bármely gomb lenyomásakor meghívásra kerül az actionperformed metódus, és paraméterként átveszi az akcióeseményt. 8

Így a lenyomás eseménye eljut a forrásobjektumból az eseményfigyelőhöz, amely lekezeli azt. Az ActionListener objektum itt dinamikusan jön létre, más elvet követve az osztály implementálhatná is az ActionListener interfészt. import javax.swing.*; import java.awt.*; import java.awt.event.*; public class Gombok { JFrame fr=new JFrame("Három gomb"); fr.setdefaultcloseoperation(jframe.exit_on_close); fr.setbounds(100, 100, 200, 100); JPanel délipanel=new JPanel(); for (int i=1; i<=3; i++) délipanel.add(new JButton(i+". gomb")); fr.add(délipanel, BorderLayout.SOUTH); final JTextField szövegmező=new JTextField(20); szövegmező.settext("még nem kattintott."); JPanel középsőpanel=new JPanel(); középsőpanel.add(szövegmező); fr.add(középsőpanel, BorderLayout.CENTER); ActionListener figyelő= new ActionListener() { public void actionperformed(actionevent ev) { szövegmező.settext(((jbutton) ev.getsource()).gettext()+ "ra kattintott."); ; for (Component gomb: délipanel.getcomponents()) if (gomb instanceof JButton) ((JButton) gomb).addactionlistener(figyelő); fr.pack(); fr.setvisible(true); 2.7. Engedélyezett karakterek használata A következő példát úgy alakítottuk ki, hogy az alsó szövegmezőbe csak olyan karaktereket lehessen beírni, amelyik megvan a felső szövegterületen. A módszer az, hogy a szövegmezőt billentyűzetesemény forrásának tekintjük; ezt a forrást megfigyeltetjük a KeyListener interfészt röptében implementáló osztály egy objektumával (erre mutat a figyelő hivatkozás). Ez az objektum a születése pillanatában a szöveg hivatkozáson át seteditable (true) üzenetet küld a szövegmezőnek. Ha a felhasználó lenyom egy billentyűt, és ahhoz a billentyűhöz nem karakter tartozik vagy olyan karakter tartozik, amelyik nincs rajta a szövegterületen (halmaz), akkor a szövegmezőt szerkeszthetetlenné tesszük (a seteditable (false) üzenettel), majd a billentyű felengedésekor a keyreleased metódusban visszaállítjuk szerkeszthetővé (a szöveg hivatkozáson át küldött seteditable(true) üzenettel). 9

import javax.swing.*; import java.awt.*; import java.awt.event.*; public class Karakterhalmaz { JFrame fr=new JFrame("Karakterhalmaz"); fr.setdefaultcloseoperation(jframe.exit_on_close); fr.setbounds(100, 100, 200, 100); JPanel északipanel=new JPanel(); JPanel délipanel=new JPanel(); fr.add(északipanel, BorderLayout.NORTH); fr.add(délipanel, BorderLayout.SOUTH); final JTextArea halmaz=new JTextArea(5, 40); északipanel.add(halmaz); final JTextField szöveg=new JTextField(40); délipanel.add(szöveg); fr.pack(); fr.setvisible(true); KeyListener figyelő= new KeyListener() { { szöveg.seteditable(true); public void keyreleased(keyevent ev) { szöveg.seteditable(true); public void keypressed(keyevent ev) { if (halmaz.gettext().indexof(ev.getkeychar())==-1) szöveg.seteditable(false); public void keytyped(keyevent ev) { ; ; szöveg.addkeylistener(figyelő); 7. ábra A Karakterhalmaz program felhasználói felülete 10

Irodalomjegyzék [1] Angster Erzsébet (2002) Objektumorientált tervezés és programozás Java 2, ISBN 963 00 6264 X, 77-94, 263-314 [2] Kölling M. (2008) The BlueJ Tutorial (version 2.0.1) [3] Nagy Tibor István (É.n.) Kivételkezelés Java-ban (prezentáció) [4] Rogers Cadenhead (2006) Tanuljuk meg a Java programozási nyelvet 24 óra alatt, ISBN 963 9637 07 6, 217-275, 299-315, 447-497 11