73
Gábor Dénes Főiskola (IAI) Angster Erzsébet: OO tervezés és programozás, Java II. kötet alapján Készítette: Andor Gergely Ellenőrizte: Dr. Szelezsán János Jóváhagyta: Lengyel Zsuzsánna

Angster Erzsébet: OO tervezés és programozás, Java II. kötet alapján

  • Upload
    rivka

  • View
    195

  • Download
    13

Embed Size (px)

DESCRIPTION

Angster Erzsébet: OO tervezés és programozás, Java II. kötet alapján. Programozási technológia. Készítette: Andor Gergely Ellenőrizte: Dr. Szelezsán János Jóváhagyta: Lengyel Zsuzsánna. I.Objektumorientált technikák II.Grafikus felhasználói interfész III.Állománykezelés - PowerPoint PPT Presentation

Citation preview

Gábor Dénes Főiskola (IAI)

Programozási technológia (Java) - I. / 1

Angster Erzsébet: OO tervezés és programozás,

Java II. kötet alapján

Készítette: Andor Gergely

Ellenőrizte: Dr. Szelezsán János

Jóváhagyta: Lengyel Zsuzsánna

Gábor Dénes Főiskola (IAI)

Programozási technológia (Java) - I. / 2

I. Objektumorientált technikák

II. Grafikus felhasználói interfész

III. Állománykezelés

IV. Vegyes technológiák

V. Adatszerkezetek, kollekciók

Gábor Dénes Főiskola (IAI)

Programozási technológia (Java) - I. / 3

1. Csomagolás, projektkezelés

2. Öröklődés

3. Interfészek, belső osztályok

4. Kivételkezelés

Gábor Dénes Főiskola (IAI)

Programozási technológia (Java) - I. / 4

1. Csomagolás, projektkezelés1. Csomagolás

2. Projektkezelés a JBuilderben

3. JAR-állomány készítése

4. Java program futtattása

Gábor Dénes Főiskola (IAI)

Programozási technológia (Java) - I. / 5

Csomagolás

Csomag (package) Összetartozó osztályok és interfészek csoportja Logikai és fizikai szintű csoportosítás

csomag1 csomag2

csomag12csomag11

csomag121

Osztaly3

Interfesz

Osztaly1

Osztaly4

Osztaly5

Osztaly2

Gábor Dénes Főiskola (IAI)

Programozási technológia (Java) - I. / 6

Könyvtárstruktúra

csomag1 csomag2

csomag11 csomag12

Interfesz.classOsztaly1.classOsztaly2.class

Osztaly4.class

csomag121

Osztaly3.class

Osztaly5.class

classes

CsomagApp

src

csomag1 csomag2

csomag11 csomag12

Interfesz.javaOsztaly2.java

Osztaly4.java

csomag121

Osztaly3.java

Osztaly5.java

Forrásútvonal Célútvonal

Projektfájl

CsomagApp.jpx

Projektkönyvtár

Gábor Dénes Főiskola (IAI)

Programozási technológia (Java) - I. / 7

Csomag megadása package csomag1.csomag12.csomag121;

Csomag azonosításaUML: csomag1::csomag12::csomag121

Java: csomag1.csomag12.csomag121

Más csomag importálása import csomag1.csomag12.csomag121.Osztaly3; import csomag1.csomag12.csomag121.*;

Gábor Dénes Főiskola (IAI)

Programozási technológia (Java) - I. / 8

Csomag elemeinek láthatósága

Osztály vagy interfész láthatósága

• publikus (public)• csomagszintű

Osztálytagok (adatok, metódusok) láthatósága

• publikus (public , +)• védett (protected , #)• privát (private , -)• csomagszintű

Az öröklési ágon az osztálytagok láthatósága csak bővíthető!

Gábor Dénes Főiskola (IAI)

Programozási technológia (Java) - I. / 9

Projektkezelés a JBuilderben

Egy adott szoftver fejlesztéséhez használt, logikailag összetartozó állományok és környezeti beállítások gyűjteménye

Projektállomány

• projektelemek (állományok) listája

• projekt tulajdonságai

Projekt (project)

Gábor Dénes Főiskola (IAI)

Programozási technológia (Java) - I. / 10

Projektkezelés JBuilderbenProjekt (project) összetartozó osztályok és interfészek csoportja logikai és fizikai szintű csoportosítás

Tartalompanel

Projektpanel

Struktúrapanel

Üzenetpanel

Gábor Dénes Főiskola (IAI)

Programozási technológia (Java) - I. / 11

Java fordítóprogram

Alapútvonalak

• kimeneti útvonal – output path• osztályútvonal – class path• forrásútvonal – source path

Példák

• 02Oroklodes\HengerProgram\src\compile1.bat:javac -g -nowarn Henger.java

• 01Projekt\CsomagApp\make.batjavac -sourcepath src -d classes -classpath . @Files.txt

Gábor Dénes Főiskola (IAI)

Programozási technológia (Java) - I. / 12

JAR-állomány készítése

JAR fájl összeállítása parancssorbóljar cfm CsomagApp.jar meta-inf\manifest.mf –C classes .

JAR (Java ARchive) Egy Java projekt fájljait tömörítő állomány Manifest (aláírásfájl, manifest.mf)

JAR fájl futtatásajava –jar CsomagApp.jar

Gábor Dénes Főiskola (IAI)

Programozási technológia (Java) - I. / 13

2. Öröklődés1. Az öröklődés fogalma2. Mintafeladat – Hengerprogram3. Az objektumreferencia statikus és dinamikus típusa4. Az utódosztály adatai és kapcsolatai5. Metódusok felülírása, dinamikus és statikus kötés6. this és super referenciák7. this és super konstruktorok – konstruktorok láncolása8. Polimorfizmus9. Absztrakt metódus, absztrakt osztály10. Láthatóság11. Összefoglalás – metódusok nyomkövetése

Gábor Dénes Főiskola (IAI)

Programozási technológia (Java) - I. / 14

Öröklődés

Öröklődés(inheritance), kiterjesztés(extension) Egy meglévő osztály kiterjesztése, továbbfejlesztése Ősosztály, utódosztály Egyszeres / többszörös öröklés

Az öröklés szabályai Egy osztályból több osztály is származtatható Az osztályhierarchia mélysége tetszőleges Az öröklés tranzitív A Javában minden osztály implicit őse az Object,

és csak egyszeres öröklés van.

Gábor Dénes Főiskola (IAI)

Programozási technológia (Java) - I. / 15

Mintafeladat – Hengerprogram

Feladat – HengerprogramKülönböző hengereket szeretnénk nyilvántartani: vannak olyan hengerek, amelyek csupán mértani testek.

Ezeknek van sugaruk és magasságuk; vannak rudak (tömör hengerek), melyeknek súlyuk is van; végül vannak csövek: valamekkora falvastagságú tömör,

lyukas hengerek.Készítsük el a megadott hengerek osztályait! Inicializáláskor a hengereknek értelemszerűen megadhatók a következő adatok: sugár, magasság, fajsúly és falvastagság. A fajsúlyt nem kötelező megadni, az alapértelmezésben legyen 1!

Gábor Dénes Főiskola (IAI)

Programozási technológia (Java) - I. / 16

Minden henger legyen képes visszaadni alapadatait, térfogatát és esetleges súlyát! A toString() metódus adja meg az adott henger szöveges reprezentációját!A fent leírt osztályokból példányosítsunk néhányat, és tegyük bele őket egy konténerbe! Végezzük el a következő feladatokat: Írjuk ki a hengerek számát, és listázzuk ki a hengerek

adatait! Számítsuk ki a konténerben található összes henger

átlag térfogatát! Listázzuk ki a csövek adatait, adjuk meg a csövek

számát és összsúlyukat!Számoljuk és a program végén írjuk ki a program futása közben született hengerek számát!

Gábor Dénes Főiskola (IAI)

Programozási technológia (Java) - I. / 17

Osztálydiagram

*hengerek

{Vector}

HengerProgram

+HengerProgram()+atlagTerfogat(): double+lista(vektor: Vector)+run()+main(...)

Henger

-szuletesSzamlalo: int-sugar, magassag: double

+Henger(sugar,magassag: double)+getSzuletesSzamlalo: int+getSugar(): double+getMagassag(): double+terfogat(): double+toString(): String

Rud

-fajsuly: double

+Rud(sugar,magassag,fajsuly: double)+Rud(sugar,magassag: double)+getFajsuly(): double+suly(): double+toString(): String

Cso

-falVastagsag: double

+Cso(sugar,magassag,fajsuly,falVastagsag: double)+Cso(sugar,magassag,falVastagsag: double)+getFalVastagsag(): double+terfogat(): double+toString(): String

Gábor Dénes Főiskola (IAI)

Programozási technológia (Java) - I. / 18

class Henger { //...

}

class Rud extends Henger { //...

}

class Cso extends Rud { //...

}

public class HengerProgram { //...

}

Gábor Dénes Főiskola (IAI)

Programozási technológia (Java) - I. / 19

Az objektumreferencia statikus és dinamikus típusa

Statikus típus: deklarált osztály Dinamikus típus: mutatott objektum valódi osztálya

Object

Henger

Rud

Cso

:Object

:Henger

:Rud

:Cso

r : Rud

Helytelen!

Gábor Dénes Főiskola (IAI)

Programozási technológia (Java) - I. / 20

Automatikus típuskonverzió felfelé (upcasting)String str = "Kakukk";

System.out.println(str.toLowerCase()); // OK

Object obj = str; //

StringObject

//System.out.println(obj.toLowerCase()); Fordítási hiba!

instanceof operátorObject obj = new String("Valami");

if (obj instanceof Object) ... // true

if (obj instanceof String) ... // true

if (obj instanceof Integer) ... // false

if ("Semmi" instanceof String) ... // true

Gábor Dénes Főiskola (IAI)

Programozási technológia (Java) - I. / 21

Típuskonverzió lefelé (downcasting)

Object obj = "Kakas"; // String Object

Integer iObj = (Integer)obj; // Object Integer (!)

System.out.println(iObj.intValue());

// ClassCastException!

Object obj = "Szoveg"; // String Object

String str = (String)obj; // Object String

// String str = obj; Fordítási hiba!

Gábor Dénes Főiskola (IAI)

Programozási technológia (Java) - I. / 22

Az utódosztály adatai és kapcsolatai

h : Henger

sugar = 1

magassag = 4

r : Rud

sugar = 0.5

magassag = 4

fajsuly = 2

cso : Cso

sugar = 5

magassag = 5

fajsuly = 0.5

falVastagsag = 2

Henger

-sugar: double

-magassag: double

Rud

-fajsuly: double

Cso

-falVastagsag: double

Példányadatok memóriafoglalása

Gábor Dénes Főiskola (IAI)

Programozási technológia (Java) - I. / 23

Hivatkozás az adatokra

Hivatkozás kívülről: publikus, nem takart

példányadatokra, illetve osztályadatokra

Hivatkozás osztályból: publikus vagy védett

ősadatokra

Adatok takarása

Adatot nem lehet felülírni!

Adat takarása = ugyanolyan nevű másik adat

deklarálása

Gábor Dénes Főiskola (IAI)

Programozási technológia (Java) - I. / 24

class C3 extends C2 { static String s = "C3 "; int b = 30; public void kiir1() { System.out.println(C1.s+C2.s+s);} //public void kiir2() { System.out.println(C1.a+C2.a+C3.a);} public void kiir3() { System.out.println(super.a+a); } public void kiir4() { System.out.println(super.b+b); }}

class C1 { static String s = "C1 "; int a = 1; int b = 10;}

class C2 extends C1 { int a = 2;}

Gábor Dénes Főiskola (IAI)

Programozási technológia (Java) - I. / 25

Metódus felülírása, dinamikus és statikus kötés

Példánymetódus felülírása (overriding) Egy metódus az utódosztályban felülírható, ha az

• nem private• nem final• nem static (példánymetódus)

Dinamikus kötés, futás alatti kötés, késői kötés

Osztálymetódus Az osztály sajátja, nem írható felül Statikus kötés

Gábor Dénes Főiskola (IAI)

Programozási technológia (Java) - I. / 26

A példánymetódus dinamikus kötése

C1

m1() {m2()}m2()

C2

m2()

obj2:C2

obj1:C1

m1()

m1()

Gábor Dénes Főiskola (IAI)

Programozási technológia (Java) - I. / 27

Az osztálymetódus statikus kötése

C1

m1() {m2()}m2()

C2

m2()

obj2:C2

obj1:C1

m1()

m1()

Gábor Dénes Főiskola (IAI)

Programozási technológia (Java) - I. / 28

this és super referenciák

A megszólított objektum referenciái

Példánydeklarációk takarása esetén használatosak

Hivatkozás saját (eltakart) adatra

this.adat

Hivatkozás ős (eltakart) adatra / metódusra

super.adat

super.metódus()

Gábor Dénes Főiskola (IAI)

Programozási technológia (Java) - I. / 29

Konstruktorok láncolása

Konstruktorhívási lánc Konstruktorok láncolásának szabályai

• Osztályon belül másik konstruktor hívása:this(paraméterek)

• A közvetlen ős konstruktor hívása:super(paraméterek)

• Minden konstruktorban pontosan egy this() vagy super() hívás legelső utasításként

Minden osztálynak van saját konstruktora A konstruktor nem öröklődik, és nem lehet felülírni

Gábor Dénes Főiskola (IAI)

Programozási technológia (Java) - I. / 30

class C1 {C1(int a) { }

}

class C2 extends C1 {C2(int a, int b) {super(a);}C2(int a) {this(a,1);}C2() {this(2);}

}

class C3 extends C2 {C3(int a, int b) { }C3(int a) {this(a,3);}

}

Példa

Gábor Dénes Főiskola (IAI)

Programozási technológia (Java) - I. / 31

class C4 extends C3 {int a;//C4() {super();} // hiba: C3-ban nincs C3()//C4() { } // hiba: C3-ban nincs C3()//C4() {a=1; super(a);} // hiba: super nem első!//C4() {this(); super(5);} // hiba: kettő nem lehet!

}

public class KonstruktorProba {public static void main (String args[]) {

new C3(1);}

}

Gábor Dénes Főiskola (IAI)

Programozási technológia (Java) - I. / 32

Polimorfizmus

:Henger :Rud :Henger :Cso:Rud

:HengerProgram

terfogat()toString()

terfogat()toString()

terfogat()toString()

Gábor Dénes Főiskola (IAI)

Programozási technológia (Java) - I. / 33

Absztrakt metódus, absztrakt osztály

Absztrakt metódus: üres metódus, mely csak örökítési célt szolgál

Absztrakt osztály: absztrakt metódust tartalmazó, nem példányosítható osztály

Jelölés• UML: dőlt betűvel• Java: abstract class <OsztályAzonosító> {

… abstract

<metódusAz>(paraméterek); …}

Gábor Dénes Főiskola (IAI)

Programozási technológia (Java) - I. / 34

Feladat – FaIdomokEgy fajátékokat tartalmazó dobozban két féle idom van: gömb és hasáb, különböző méretekben. Készítsünk olyan programot, amellyel nyilvántart-hatjuk különböző idomok adatait! Írjuk ki a következőket: az összes idom adatait a felvitel sorrendjében; az idomok összsúlyát; a gömbök összsúlyát; a legkisebb és a legnagyobb térfogatú idom

típusát és adatait!

Gábor Dénes Főiskola (IAI)

Programozási technológia (Java) - I. / 35

Osztálydiagramidomok

*-idomok{Vector}

Hasab

-a,b,magassag: double

+Hasab(a,b,magassag:double)+terfogat(): double+toString(): String

Gomb

-sugar: double

+Gomb(sugar:double)+terfogat(): double+toString(): String

FaIdomok

+FaIdomok()+osszSuly(): double+osszGombSuly(): double+run() +main(...)

java::lang::Comparable

Idom { abstract }

-fajsuly: double = 0.8

+terfogat(): double+suly(): double+compareTo(obj:Object): int

java::lang::Object

Gábor Dénes Főiskola (IAI)

Programozási technológia (Java) - I. / 36

3. Interfészek, belső osztályok1. Interfész

2. Belső osztály

3. Névtelen osztály

Gábor Dénes Főiskola (IAI)

Programozási technológia (Java) - I. / 37

Interfész

Konstansokat és metódusfejeket definiál Implementáló osztály: a metódusokat implementálja Deklarációja:

[public] interface <InterfészAzon> [extends <InterfészAzon,...>] {

<konstansok, metódusfejek>}

Abstract, nem példányosítható Egyetlen lehetséges módosítója: public Konstansok módosítói: public, static, final Metódusfejek módosítói: public, abstract

Gábor Dénes Főiskola (IAI)

Programozási technológia (Java) - I. / 38

Az interfész implementálása

Implementáló osztály: speciális utódja az interfésznek

Nem abstract osztály összes metódust meg kell írni

Abstract osztály az utódban befejezhető az

implementálás

Egy osztály akárhány interfészt implementálhat!

Az interfész egyes metódusait az implementáló osztály

örökölheti is

Gábor Dénes Főiskola (IAI)

Programozási technológia (Java) - I. / 39

Az interfész öröklése Az interfészek örökíthetők Az utód interfész örökli az ős interfész deklarációit Az utód interfész implementálásakor implementálnunk

kell az ős interfész metódusait is Egy interfész akárhány interfészt örökölhet!

Értékadási kompatibilitás Az objektum statikus referenciája lehet interfész típusú Az implementáló osztály objektuma értékül, illetve

paraméterül adható az interfész típusú statikus referenciának

Gábor Dénes Főiskola (IAI)

Programozási technológia (Java) - I. / 40

Feladat – Sorok feldolgozása, QueueAppA sor szekvenciális, csak sorban feldolgozható konténer; csak a végére lehet új elemet tenni, s csak a legelsőnek betett elemet lehet kivenni belőle. Készítsünk két interfészt:Az IQueue olyan sor, amely képes a következőkre: Betesz egy új objektumot a sor végére; Kiveszi, és rendelkezésre bocsátja a sor legelső

objektumát; Megmondja, hogy a sor üres-e.

Az ICleverQueue okos sor (clever queue), s az előbbieken túl a következőket is tudja: Kiveszi és megszünteti a sor első n objektumát; Megadja a sorban álló objektumok számát.

Gábor Dénes Főiskola (IAI)

Programozási technológia (Java) - I. / 41

Készítsünk mindkét interfészből egy-egy osztályt! Az ICleverQueue implementációja legyen leszármazottja az IQueue implementációjának.Az interfészeket és az osztályokat tegyük be az extra.util csomagba, hogy később is használhassuk őket!Végül készítsünk egy programot, amely menüvezérelten végzi a következő funkciókat: betesz a sorba egy szöveget; kivesz a sorból egy szöveget (ha van) és ki is írja; kitöröl a sorból három szöveget, ha van benne annyi!

Gábor Dénes Főiskola (IAI)

Programozási technológia (Java) - I. / 42

Osztálydiagramextra::util

«interfész»IQueue

+put(Object)+get(): Object+isEmpty(): boolean

QueueApp

+main(...)+processQueue(ICleverQueue)

«interfész»ICleverQueue

+remove(int)+size(): int

java::lang::Object

Queue

+put(Object)+get(): Object+isEmpty(): boolean

CleverQueue

+remove(int)+size(): int

ForráskódokProjekt: QueueAppCsomaghierarchia:• QueueApp• extra

• util• IQueue• ICleverQueue• Queue• CleverQueue

Gábor Dénes Főiskola (IAI)

Programozási technológia (Java) - I. / 43

IQueue.javapackage extra.util;public interface IQueue {

void put(Object o);Object get();boolean isEmpty();

}

ICleverQueue.javapackage extra.util;public interface ICleverQueue extends IQueue {

void remove(int n);int size();

}

Gábor Dénes Főiskola (IAI)

Programozási technológia (Java) - I. / 44

Queue.java...public class Queue implements IQueue {

protected Vector v = new Vector();public void put(Object o) { v.add(o);}...

}

CleverQueue.java...public class CleverQueue extends Queue

implements ICleverQueue {...

}

Gábor Dénes Főiskola (IAI)

Programozási technológia (Java) - I. / 45

Konstans az interfészben

Feladat – SzámlaKérjünk be egy forintösszeget, majd írjuk ki az értékét euróban!...interface Euro { int ARFOLYAM = 230; String NEV = "EURO";}

public class Szamla implements Euro {public static void main (String args[]) {

int ftOsszeg = Console.readInt("Összeg (Ft): ");System.out.println((ftOsszeg/ARFOLYAM)+" "+NEV);

}}

Gábor Dénes Főiskola (IAI)

Programozási technológia (Java) - I. / 46

Belső osztály

Osztályon belül deklarált másik osztály:class <KulsoOsztályAzon> ... { ... class <BelsoOsztályAzon> ... { ... }}

Csak az őt deklaráló külső osztály ismeri

Példányosítás: külső osztály példánymetódusából

Gábor Dénes Főiskola (IAI)

Programozási technológia (Java) - I. / 47

Belső osztály (folyt.)

Példánya ismeri az őt létrehozó külső objektumot

• implicit referencia

• hivatkozás takarásnál: KülsőOsztály.this

Nem lehetnek statikus deklarációi

Nem kötelező azonosítani (névtelen belső osztály)

Fordítóprogram különálló külső osztállyá alakítja:

KülsőOsztályAzon$BelsőOsztályAzon.class

KülsőOsztályAzon$n.class (n=1,2,…)

Gábor Dénes Főiskola (IAI)

Programozási technológia (Java) - I. / 48

Feladat – UdvarAppEgy udvaron különböző négyzetes oszlopok vannak elhelyezve. Tartsuk nyilván az udvar és az oszlopok adatait, majd készítsünk róluk jelentést! Ne engedjünk olyan oszlopot létrehozni, amely az udvaron kívülre esik!

Gábor Dénes Főiskola (IAI)

Programozási technológia (Java) - I. / 49

import java.util.*;

class Udvar { // Udvar.class

private int szel=100, hossz=50;

private Vector oszlopok = new Vector();

public Udvar() {

oszlopok.add(new Oszlop(25,30));

oszlopok.add(new Oszlop(40,5));

oszlopok.add(new Oszlop(97,10));

}

Gábor Dénes Főiskola (IAI)

Programozási technológia (Java) - I. / 50

class Oszlop { // Udvar$Oszlop.class private int x, y; private int szel=5;

public Oszlop(int x, int y) {if (x>=0 && x<=Udvar.this.szel-szel &&

y>=0 && y<=hossz-szel) {this.x = x; this.y = y;

}else {

this.x = 0; this.y = 0;}

}

Gábor Dénes Főiskola (IAI)

Programozási technológia (Java) - I. / 51

public String toString() {

return x+"-"+y;

}

} // Oszlop

public String toString() {

return Udvar:"+szel+"x"+hossz+

",Oszlopok:"+oszlopok;

}

} // Udvar

Gábor Dénes Főiskola (IAI)

Programozási technológia (Java) - I. / 52

public class UdvarApp { // UdvarApp.class

public static void main(String[] args) {

Udvar udvar = new Udvar();

System.out.println(udvar);

}

}

Gábor Dénes Főiskola (IAI)

Programozási technológia (Java) - I. / 53

Feladat – UdvarApp2Oldjuk meg az előző feladatot belső osztály nélkül!

...

class Oszlop { // Oszlop.class...

public Oszlop(Udvar udvar,int x, int y) {

if (x>=0 && x<=udvar.szel-szel &&

y>=0 && y<=udvar.hossz-szel) {…

}…

} // Oszlop

Gábor Dénes Főiskola (IAI)

Programozási technológia (Java) - I. / 54

class Udvar { // Udvar.class…

public Udvar() {

oszlopok.add(new Oszlop(this,25,30));

oszlopok.add(new Oszlop(this,40,5));

oszlopok.add(new Oszlop(this,97,10));}…

} // Udvar

public class UdvarApp2 { // UdvarApp2.class…

}

Gábor Dénes Főiskola (IAI)

Programozási technológia (Java) - I. / 55

Névtelen osztály

Nincs neve Máshol nem lehet rá hivatkozni

Egyszer példányosítható

Az objektum létrehozásával egyidőben deklaráljuk

Névtelen osztályú objektum létrehozása

• Osztály kiterjesztésével

• Interfész implementálásával

Nincs konstruktora

Gábor Dénes Főiskola (IAI)

Programozási technológia (Java) - I. / 56

Névtelen osztály példányosítása osztály kiterjesztésével

class Ember { … } // Ember.class

public class NevtelenKiterjesztes {// NevtelenKiterjesztes.class

public static void main(String[] args) {Vector emberek = new Vector();emberek.add(new Ember("Zoli") {

public String jellemzo() {return "Kövér";

}}); … // NevtelenKiterjesztes$1.class

}}

Gábor Dénes Főiskola (IAI)

Programozási technológia (Java) - I. / 57

Névtelen osztály példányosítása interfész implementálásával

interface Jellemzett { // Jellemzett.classpublic String jellemzo();

}public class NevtelenImplementacio {

// NevtelenImplementacio.classpublic static void main(String[] args) {

Jellemzett jel = new Jellemzett() {public String jellemzo() {

return "Szép";}

}); … // NevtelenImplementacio$1.class}

}

Gábor Dénes Főiskola (IAI)

Programozási technológia (Java) - I. / 58

4. Kivételkezelés1. Kivételek, hibák

2. Kivételek keletkezése és szándékos kiváltása – throw

3. A kivétel továbbadása – throws

4. A kivétel elkapása, kezelése

5. Saját kivételek használata

Gábor Dénes Főiskola (IAI)

Programozási technológia (Java) - I. / 59

Rendszerhibák és kivételek

Programot leállító események: objektumok, melyek osztályai a Throwable osztály leszármazottai

A „dobható” események két csoportja:

• Rendszerhiba (Error): a programot leállítja• Kivétel (Exception): hibakezelés után a

program folytatódhat• Nem ellenőrzött kivétel: nem kötelező kezelni

(futási hibák, RuntimeException és annak leszármazottai)

• Ellenőrzött kivétel: kötelező kezelni (többi Exception)

Gábor Dénes Főiskola (IAI)

Programozási technológia (Java) - I. / 60

Object java.lang Throwable java.lang Error java.lang LinkageError java.lang VirtualMachineError java.lang ThreadDeath java.lang AWTError java.lang Exception java.lang RuntimeException java.lang ArrayIndexOutOfBoundsException java.lang ArithmeticException java.lang ClassCastException java.lang IllegalArgumentException java.lang NumberFormatException java.lang ... NegativeArraySizeException java.lang NoSuchElementException java.util ... NullPointerException java.lang IOException java.io EOFException java.io FileNotFoundException java.io ... AWTException java.awt ...

Gábor Dénes Főiskola (IAI)

Programozási technológia (Java) - I. / 61

A kivételosztályok deklarációi

+RuntimeException()+RuntimeException(m: String)

java::lang::RuntimeException

IOException()IOException(m: String)

java::io::IOException

+Exception()+Exception(m: String)

java.lang::Exception

-detailMessage: String

+Throwable()+Throwable(message: String)+getMessage():String+getLocalizedMessage(): String+printStackTrace()+toString(): String...

java::lang::Throwable

...

Gábor Dénes Főiskola (IAI)

Programozási technológia (Java) - I. / 62

Kivételek keletkezése és szándékos előidézése – throw

Kivétel kiváltása: kivételobjektum létrehozása és bedobása (throw) a program vérkeringésébe

Ki váltja ki?

• API metódus

• programozó

Szintaktika:throw new <Kivételosztály>(<információs szöveg>);throw new ArithmeticException("Osztás nullával!");throw new TulNagyException("Túl nagy szám!");

Gábor Dénes Főiskola (IAI)

Programozási technológia (Java) - I. / 63

Feladat – Kivétel útjaKeltsünk szándékosan futási hibát az ábrán látható módon! Kövessük a kivétel kiszállásának útját!

KivetelUtja.m1()

...Masik.m2()...

KivetelUtja.main(...)

...m1()...

... ...

Masik.m2()

A program futása:java.lang.RuntimeException: Rosszalkodas

at Masik.m2(KivetelUtja.java:4)at KivetelUtja.m1(KivetelUtja.java:10)at KivetelUtja.main(KivetelUtja.java:13)

Exception in thread "main"

Gábor Dénes Főiskola (IAI)

Programozási technológia (Java) - I. / 64

class Masik {

static void m2() {

throw new RuntimeException("Rosszalkodas"); }

}

public class KivetelUtja {

static void m1() {

Masik.m2();}public static void main(String[] args) {

m1();}

}

Gábor Dénes Főiskola (IAI)

Programozási technológia (Java) - I. / 65

A kivétel továbbadása – throws

Ellenőrzött kivételekkel a metódushívási lánc minden metódusában foglalkoznunk kell

Két lehetőségünk van:

- a metódusban kezeljük a kivételt

- a kivételt továbbadjuk a hívó metódusnak

Kivétel továbbadásának jelzése a metódusfejben: throws <Kivételosztály1, Kivételosztály2,... >throws Exception

A kivételosztályok továbbadáskor nem szűkíthetők!

Gábor Dénes Főiskola (IAI)

Programozási technológia (Java) - I. / 66

Feladat – Ellenőrzött kivétel továbbadásaIdézzünk elő egy main által hívott metódusban egy ellenőrzött, IOException típusú kivételt.

import java.io.*;public class EllenorzottDobas {

static void metodusA() throws IOException {throw new IOException("Számot kérek!");

}

public static void main (String args[]) throws IOException {metodusA();

} }

A program futása:java.io.IOException: Számot kérek!

at EllenorzottDobas.metodusA(EllenorzottDobas.java:5)at EllenorzottDobas.main(EllenorzottDobas.java:9)

Exception in thread "main"

Gábor Dénes Főiskola (IAI)

Programozási technológia (Java) - I. / 67

A kivétel elkapása, kezelésetry-catch-finally szerkezet

try { // try blokk <utasítások>

}catch (<Kivételosztály1> <obj1>) { // catch blokk

<utasítások>}…catch (<KivételosztályN> <objn>) { // catch blokk

<utasítások>}finally { // finally blokk

<utasítások>}

Gábor Dénes Főiskola (IAI)

Programozási technológia (Java) - I. / 68

try blokk Kivételek keletkezésének feltételezett helye

catch blokk Kivétel kezelése az érkező kivételobjektum alapján Aktuális (érkező) kivételobjektum

• értékadási kompatibilitás:formális kivételobjektum = aktuális kivételobjektum

• manipulálható, a blokk végén elpusztul Működése

• legfeljebb egy catch blokk hajtódik végre• sorrend: egyre általánosabb kivételek definiálandók• nincs kezelve továbbadódik a hívó metódusnak

finally blokk Minden körülmények között végrehajtódik

Gábor Dénes Főiskola (IAI)

Programozási technológia (Java) - I. / 69

A kivétel elkapásának útja

metodusB()throws IOException

metodusA()

utasításokmetodusC()...utasítások

main()

utasításokmetodusA()...utasítások...

utasítások IOExceptionutasítások

metodusC()throws IOException

utasításoktry metodusB() ...catch (IOException)

catch (Exception)

finally

Itt keletkezikItt kezeljük

Itt már nem kell throws, mert kezeljük a kivételt

Gábor Dénes Főiskola (IAI)

Programozási technológia (Java) - I. / 70

Saját kivételek

Feladat – Saját kivétel alkalmazásaÍrjunk egy readSzam(tol,ig) függvényt, amely bekér egy egész számot valamilyen megadott zárt tartományból (tol lehet nagyobb is, mint ig)! Addig kérjünk számot, ameddig az végre a megadott tartományba esik. Ha a szám kívül esik rajta, akkor a metódus ejtsen egy saját (vagyis nem API-beli) OutOfRangeException kivételt és az abba foglalt információs szöveg közölje a megkövetelt határokat!

Gábor Dénes Főiskola (IAI)

Programozási technológia (Java) - I. / 71

import extra.*;

class OutOfRangeException extends RuntimeException {

OutOfRangeException(String s) {

super(s);

}

}

public class SajatKivetel {

static int readSzam(int tol, int ig) {

if (tol > ig) {

int seged=tol; tol=ig; ig=seged;

}

int szam;

Gábor Dénes Főiskola (IAI)

Programozási technológia (Java) - I. / 72

while (true) {try {

szam = Integer.parseInt(Console.readLine("Szám: "));if (szam < tol || szam > ig)

throw new OutOfRangeException(tol+"-től "+ig+"-ig!");return szam;

} // trycatch (NumberFormatException ex) {

System.out.println("Illegális karakter!");}catch (OutOfRangeException ex) {

System.out.println(ex.getMessage());}

} // while

Gábor Dénes Főiskola (IAI)

Programozási technológia (Java) - I. / 73

} // readSzam

public static void main (String args[]) {

int lottoSzam = readSzam(1,90);

System.out.println("OK");

} // main

} // SajatKivetel