Az előadás letöltése folymat van. Kérjük, várjon

Az előadás letöltése folymat van. Kérjük, várjon

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.

Hasonló előadás


Az előadások a következő témára: "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."— Előadás másolata:

1 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

2 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

3 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

4 Gábor Dénes Főiskola (IAI)Programozási technológia (Java) - I. / 4 1. Csomagolás, projektkezelés 1.Csomagolás 2.Projektkezelés a JBuilderben 3.JAR-állomány készítése 4.Java program futtattása

5 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 csomag12 csomag11 csomag121 Osztaly3 Interfesz Osztaly1 Osztaly4 Osztaly5 Osztaly2

6 Gábor Dénes Főiskola (IAI)Programozási technológia (Java) - I. / 6 Könyvtárstruktúra csomag1csomag2 csomag11csomag12 Interfesz.class Osztaly1.class Osztaly2.class Osztaly4.class csomag121 Osztaly3.class Osztaly5.class classes CsomagApp src csomag1csomag2 csomag11csomag12 Interfesz.java Osztaly2.java Osztaly4.java csomag121 Osztaly3.java Osztaly5.java Forrásútvonal Célútvonal Projektfájl CsomagApp.jpx Projektkönyvtár

7 Gábor Dénes Főiskola (IAI)Programozási technológia (Java) - I. / 7 Csomag megadása package csomag1.csomag12.csomag121; Csomag azonosítása UML: csomag1::csomag12::csomag121 Java: csomag1.csomag12.csomag121 Más csomag importálása import csomag1.csomag12.csomag121.Osztaly3; import csomag1.csomag12.csomag121.*;

8 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ő!

9 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)

10 Gábor Dénes Főiskola (IAI)Programozási technológia (Java) - I. / 10 Projektkezelés JBuilderben Projekt (project)  összetartozó osztályok és interfészek csoportja  logikai és fizikai szintű csoportosítás Tartalompanel Projektpanel Struktúrapanel Üzenetpanel

11 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.bat javac -sourcepath src -d classes

12 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ól jar 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ása java –jar CsomagApp.jar

13 Gábor Dénes Főiskola (IAI)Programozási technológia (Java) - I. / Öröklődés 1. Az öröklődés fogalma 2.Mintafeladat – Hengerprogram 3.Az objektumreferencia statikus és dinamikus típusa 4.Az utódosztály adatai és kapcsolatai 5.Metódusok felülírása, dinamikus és statikus kötés 6. this és super referenciák 7.this és super konstruktorok – konstruktorok láncolása 8.Polimorfizmus 9.Absztrakt metódus, absztrakt osztály 10.Láthatóság 11.Összefoglalás – metódusok nyomkövetése

14 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.

15 Gábor Dénes Főiskola (IAI)Programozási technológia (Java) - I. / 15 Mintafeladat – Hengerprogram Feladat – Hengerprogram Kü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!

16 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!

17 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

18 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 { //... }

19 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!

20 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; // String  Object //System.out.println(obj.toLowerCase()); Fordítási hiba! instanceof operátor Object obj = new String("Valami"); if (obj instanceof Object)... // true if (obj instanceof String)... // true if (obj instanceof Integer)... // false if ("Semmi" instanceof String)... // true

21 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!

22 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

23 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

24 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; }

25 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

26 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()

27 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()

28 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()

29 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

30 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

31 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); }

32 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()

33 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 { … abstract (paraméterek); … }

34 Gábor Dénes Főiskola (IAI)Programozási technológia (Java) - I. / 34 Feladat – FaIdomok Egy 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!

35 Gábor Dénes Főiskola (IAI)Programozási technológia (Java) - I. / 35 Osztálydiagram idomok * -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

36 Gábor Dénes Főiskola (IAI)Programozási technológia (Java) - I. / Interfészek, belső osztályok 1.Interfész 2.Belső osztály 3.Névtelen osztály

37 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 [extends ] { }  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

38 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

39 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

40 Gábor Dénes Főiskola (IAI)Programozási technológia (Java) - I. / 40 Feladat – Sorok feldolgozása, QueueApp A 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.

41 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!

42 Gábor Dénes Főiskola (IAI)Programozási technológia (Java) - I. / 42 Osztálydiagram extra::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ódok Projekt: QueueApp Csomaghierarchia: QueueApp extra util IQueue ICleverQueue Queue CleverQueue

43 Gábor Dénes Főiskola (IAI)Programozási technológia (Java) - I. / 43 IQueue.java package extra.util; public interface IQueue { void put(Object o); Object get(); boolean isEmpty(); } ICleverQueue.java package extra.util; public interface ICleverQueue extends IQueue { void remove(int n); int size(); }

44 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 CleverQueueextends Queue implements ICleverQueue {... }

45 Gábor Dénes Főiskola (IAI)Programozási technológia (Java) - I. / 45 Konstans az interfészben Feladat – Számla Ké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); }

46 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... {... class... {... } }  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

47 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,…)

48 Gábor Dénes Főiskola (IAI)Programozási technológia (Java) - I. / 48 Feladat – UdvarApp Egy 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!

49 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)); }

50 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; }

51 Gábor Dénes Főiskola (IAI)Programozási technológia (Java) - I. / 51 public String toString() { return x+"-"+y; } } // Oszlop public String toString() { returnUdvar:"+szel+"x"+hossz+ ",Oszlopok:"+oszlopok; } } // Udvar

52 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); }

53 Gábor Dénes Főiskola (IAI)Programozási technológia (Java) - I. / 53 Feladat – UdvarApp2 Oldjuk 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

54 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 … }

55 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

56 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 }

57 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.class public String jellemzo(); } public class NevtelenImplementacio { //  NevtelenImplementacio.class public static void main(String[] args) { Jellemzett jel = new Jellemzett() { public String jellemzo() { return "Szép"; } }); … //  NevtelenImplementacio$1.class }

58 Gábor Dénes Főiskola (IAI)Programozási technológia (Java) - I. / Kivételkezelés 1.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

59 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 )

60 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 ArrayIndexOutOfBoundsExceptionjava.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...

61 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...

62 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 ( ); throw new ArithmeticException("Osztás nullával!"); throw new TulNagyException("Túl nagy szám!");

63 Gábor Dénes Főiskola (IAI)Programozási technológia (Java) - I. / 63 Feladat – Kivétel útja Keltsü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"

64 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(); }

65 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 throws Exception  A kivételosztályok továbbadáskor nem szűkíthetők!

66 Gábor Dénes Főiskola (IAI)Programozási technológia (Java) - I. / 66 Feladat – Ellenőrzött kivétel továbbadása Idé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"

67 Gábor Dénes Főiskola (IAI)Programozási technológia (Java) - I. / 67 A kivétel elkapása, kezelése try-catch-finally szerkezet try {// try blokk } catch ( ) {// catch blokk } … catch ( ) {// catch blokk } finally {// finally blokk }

68 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

69 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ások metodusC()... utasítások main() utasítások metodusA()... utasítások... utasítások  IOException utasítások metodusC() throws IOException utasítások try metodusB()... catch (IOException) catch (Exception) finally Itt keletkezik Itt kezeljük Itt már nem kell throws, mert kezeljük a kivételt

70 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!

71 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;

72 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 ig) throw new OutOfRangeException(tol+"-től "+ig+"-ig!"); return szam; } // try catch (NumberFormatException ex) { System.out.println("Illegális karakter!"); } catch (OutOfRangeException ex) { System.out.println(ex.getMessage()); } } // while

73 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


Letölteni ppt "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."

Hasonló előadás


Google Hirdetések