Objektum Orientált Programozás 7. K: JAVA alapok Konzultáció 35/1B IT MAN B IT v: 2017.05.03 MAN
Hiba, biztonságos program 01. Szintaktikai hiba imt i = 0; system.out.println( alma ); for (int i = 0, i<= 10, i++)... Szemantikai hiba int a=0, b=10/a; x1=(-b+math.sqrt(b*b-4*a*c))/2*a; args[++i] Biztonságos program szemantikai hibákat megpróbálja kezelni a belőlük következő hibákkal együtt ennek módja: kivételkezelés 35/2 B IT MAN
Kivételkezelés 02. kivétel (exception): a program futása során bekövetkező hiba; olyan esemény, amely megszakítja az utasítások végrehajtásának normális menetét kivételobjektum: ha hiba keletkezik, automatikusan létrejön kivétel kiváltódása: a hiba hatására létrejön az objektum kivétel elkapása: kivételt lehetőségünk van elkapni és kezelni kivételkezelés: azt a programrészletet, melyben az adott hibát orvosoljuk ellenőrzött kivétel: kezelése minden esetben kötelező; nem kezelése szintaktikai hibát eredményez, és a program fordítása sikertelen lesz nem ellenőrzött kivétel: kezelése nem kötelező; kiváltódásának ellenőrzése sem kötelező, ám minden esetben ajánlott 35/3 B IT MAN
Kivételosztályok 03. Ellenőrzött kivételek IOException Ki- és bemeneti hibák esetén váltódik ki, pl. konzolról való beolvasáskor. FileNotFoundException EOFException Nem ellenőrzött kivételek Az IOException egyik alkivételosztálya. Akkor kapjuk például, ha nem létező fájlba próbálunk írni. Fájl végét jelző kivétel. Szintén az IOException alosztálya. RuntimeException NullPointerException IndexOutOfBounds Exception ArithmeticException Valamennyi futásidejű kivétel ősosztálya. Olyan esetben kapjuk, ha null értékű, azaz inicializálatlan változóra vagy objektumra hivatkozunk. Túlindexelést jelző kivétel. Akkor kapjuk, ha egy tömb, karakterlánc, vagy más indexelhető szerkezet nem létező indexére hivatkozunk. Aritmetikai műveletek hibájakor kapjuk, például nullával való osztáskor. NumberFormatException Akkor kapjuk például, ha nem megfelelő számot tartalmazó karakterláncot próbálunk szám típusúvá konvertálni. IllegalArgument Akkor váltódik ki, ha egy metódust nem megfelelő paraméterekkel Exception hívunk. 35/4 B IT MAN
Try-catch blokk 04. Ha a kivételt nem kezeljük abban a blokkban, ahol keletkezett, úgy a tartalmazó blokknak adódik át. Ez egészen addig folytatódik, míg valahol nincs egy olyan kivételkezelő blokk, mely az adott kivételt kezelné. Ha a kivételt egyik blokkban sem kezeljük, és feljut a legfelsőbb szintre: a program terminál Szintaktikája try { kritikus műveletek; catch (KivételTípus1 e1) { hibakezelés catch (KivételTípus2 e2) { hibakezelés... 35/5 B IT MAN
HibaProba futtatható osztály Direkt hibázunk, kiíratjuk a hiba típusát, aztán lekezeljük! public class HibaProba { public static void main(string[ ] args) { int [ ] s = new int[4]; for (int i=1; i<4; i++){ s[i] = (int)(math.random()*20); for (int i=0; i<4; i++) System.out.println(s[i]); System.out.println(s[2]/s[0]); Konzol Az s tömbnek minden eleme 0 értékkel jön létre. A 0. elem 0 marad, a többi elem más értéket kap. 0 12 15 15 Exception in thread "main" java.lang.arithmeticexception: / by zero 35/6 at HibaProba.main(HibaProba.java:12) B IT MAN
HibaProba futtatható osztály Direkt hibázunk, kiíratjuk a hiba típusát, aztán lekezeljük! public class HibaProba { public static void main(string[ ] args) { int [ ] s = new int[4]; for (int i=1; i<4; i++){ s[i] = (int)(math.random()*20); for (int i=0; i<4; i++) System.out.println(s[i]); try { System.out.println(s[2]/s[0]); catch(arithmeticexception ae){ System.out.println("Nullával osztottál!"); Konzol 0 12 15 15 35/7 Nullával osztottál! B IT MAN
HibaProba futtatható osztály Direkt hibázunk, kiíratjuk a hiba típusát, aztán lekezeljük! public class HibaProba { public static void main(string[ ] args) { int [ ] s = new int[4]; for (int i=1; i<4; i++){ s[i] = (int)(math.random()*20); for (int i=0; i<4; i++) System.out.println(s[i]); System.out.println("Az 5. elem értéke: "+s[5]); Konzol 0 12 7 11 Exception in thread "main" java.lang.arrayindexoutofboundsexception: 5 A tömbnek csak 4 eleme van! 35/8 at HibaProba.main(HibaProba.java:12) B IT MAN
HibaProba futtatható osztály Direkt hibázunk, kiíratjuk a hiba típusát, aztán lekezeljük! public class HibaProba { public static void main(string[ ] args) { int [ ] s = new int[4]; for (int i=1; i<4; i++){ s[i] = (int)(math.random()*20); for (int i=0; i<4; i++) System.out.println(s[i]); try { System.out.println("Az 5. elem értéke: "+s[5]); catch(arrayindexoutofboundsexception e){ System.out.println("Hibás indexhasználat a tömbnél!"); Konzol 0 12 15 15 35/9 Hibás indexhasználat a tömbnél! B IT MAN
HibaProba futtatható osztály Direkt hibázunk, kiíratjuk a hiba típusát, aztán lekezeljük! public class HibaProba { public static void main(string[ ] args) { int [ ] s = new int[4]; for (int i=0; i<4; i++) System.out.println(s[i]); s = null; System.out.println(s[0]); Konzol Az s tömbnek minden eleme 0 értékkel jön létre. Az s tömbnek minden eleme null referenciájú lesz! Mi az s változó dinamikus és statikus típusa? 0 0 0 0 Exception in thread "main" Null értékre mutató referencia kivétel! java.lang.nullpointerexception at HibaProba.main(HibaProba.java:12) 35/10 B IT MAN
HibaProba futtatható osztály Direkt hibázunk, kiíratjuk a hiba típusát, aztán lekezeljük! public class HibaProba { public static void main(string[ ] args) { int [ ] s = new int[4]; for (int i=0; i<4; i++) System.out.println(s[i]); s = null; try { System.out.println(s[0]); catch(arrayindexoutofboundsexception e){ System.out.println("Null értékre mutató referencia!"); 0 12 15 15 Konzol 35/11 Null értékre mutató referencia! B IT MAN
SajatKivetel osztály Mindig az Exception osztály leszármazottja public class SajatKivetel extends Exception { SajatKivetel(String uzenet) { super(uzenet); 35/12 B IT MAN
HibaProba futtatható osztály Kivételek lekezelése saját kivétel osztállyal public class HibaProba { public static void main(string[ ] args) { int [ ] s = new int[4]; for (int i=0; i<4; i++) System.out.println(s[i]); s = null; try { if (s == null) throw new SajatKivetel("Null értékre mutató referencia!"); System.out.println(s[0]); catch(sajtkivetel sk){ System.out.println(sk.getMessage()); 0 0 0 0 Konzol public class SajatKivetel extends Exception { SajatKivetel(String uzenet) { super(uzenet); 35/13 Null értékre mutató referencia! B IT MAN
HibaProba futtatható osztály Kivételek lekezelése saját kivétel osztállyal public class HibaProba { public static void main(string[ ] args) { int [ ] s = new int[4]; for (int i=0; i<4; i++) System.out.println(s[i]); s = null; try { if (s[0] == 0) throw new SajatKivetel("Az osztó értéke: 0!"); System.out.println(s[2]/s[0]); if (5 > s.length) throw new SajatKivetel("Az index nagyobb, mint a tömb mérete!"); System.out.println("Az 5. elem értéke: "+s[5]); catch(sajtkivetel sk){ System.out.println(sk.getMessage()); 0 0 0 0 Konzol public class SajatKivetel extends Exception { SajatKivetel(String uzenet) { super(uzenet); 35/14 Az osztó értéke: 0! B IT MAN
Gyakorló példa a számonkérésre 1. Feladat: Készítsen egy Szemely nevű osztályt a szokásos konvenciók betartásával, amely tárolja egy ember nevét (szöveg) és Neptun kódját (szöveg) Készítsen konstruktort, mely a név és a kód alapján inicializál egy példányt Legyen az osztálynak a nevet visszaadó metódusa Alkosson olyan törzs nélküli metódust, mellyel egész értékként kiszámítja a Juttatás-t. 2. Feladat: Készítse el a Hallgato nevű osztályt, a Szemely osztály leszármazottjaként Az osztály tárolja a Hallgató féléves jegyeit egy egész típusú tömbbe, és legyen egy Ösztöndíjat tároló adattagja is. Az osztályhoz tartozzon egy konstans, mely az ösztöndíj számítás ALAPértékét jelentse, értéke legyen 10000. 35/15 B IT MAN
Gyakorló példa a számonkérésre A 2. Feladat folytatása: Készítsen egy, a jegyek számát beállító metódust Készítsen egy metódust, egy konkrét (valahányadik) jegy beírására Alkosson metódust az ösztöndíj beállítására Készítsen egy Átlag metódust, mely a jegyek átlagát adja vissza A Juttatás metódus adja vissza egy hallgató juttatását, mely ha az átlag legalább hármas, akkor az átlag és az alap szorzata, egyébként nulla. Az osztály tostring metódusa a következő formában adjon vissza adatot: Név: Géza, Átlag: 3.1, Ösztöndíj: 31000 Készítsen egy jegykiír nevű metódust, mely kiírja egy hallgató nevét és összes jegyét a következő formában: Géza 0. jegye: 5 Géza 1. jegye: 5 Géza 2. jegye: 2 Géza 3. jegye: 3... 35/16 B IT MAN
Gyakorló példa a számonkérésre 3. Feladat: Készítsen egy HallgatoProgram nevű futtatható osztályt Készítsen egy 5 elemű tömböt hallgatók adatainak tárolására Olvasson be a billentyűzetről a hallgatók nevét és kódját, és az adatokkal inicializálja a hallgatók adatait Állítsa be a jegyek számát 10-re, és minden hallgatóhoz generáljon véletlenszerűen az (1-5) tartományban jegyeket Állítsa be minden hallgatónál az ösztöndíjat, melyet a Juttatás metódussal határozzon meg Írassa ki minden Hallgató adatait a képernyőre Írassa ki az utolsó hallgató jegyeit a képernyőre 35/17 B IT MAN
Gyakorló példa a számonkérésre Futtatási minta: A hallgató neve: Jenő A hallgató kódja: ab45bb A hallgató neve: Béla A hallgató kódja: 3mz675 A hallgató neve: Éva A hallgató kódja: cc98vv A hallgató neve: Zoli A hallgató kódja: zxa3e4 A hallgató neve: Géza A hallgató kódja: wxyc78 Név: Jenő, Átlag: 3.5, Ösztöndíj: 35000 Név: Béla, Átlag: 4.0, Ösztöndíj: 40000 Név: Éva, Átlag: 2.5, Ösztöndíj: 0 Név: Zoli, Átlag: 2.6, Ösztöndíj: 0 Név: Géza, Átlag: 3.1, Ösztöndíj: 31000 Géza 0. jegye: 5 Géza 1. jegye: 5 Géza 2. jegye: 2 Géza 3. jegye: 3 Géza 4. jegye: 5 Géza 5. jegye: 1 Géza 6. jegye: 3 Géza 7. jegye: 4 Géza 8. jegye: 1 Géza 9. jegye: 2 35/18 B IT MAN
Szemely osztály, adattagok: név, neptunkód Konstruktor (név, neptunkód). Metódusok: getnev, Juttatás public abstract class Szemely { private String Nev; private String Neptunkod; public Szemely (String Nev, String Kod){ this.nev = Nev; Neptunkod = Kod; public String getnev(){ return Nev; public abstract int Juttatas(); 35/19 B IT MAN
Hallgato osztály, szülő: Szemely, adattagok: jegyek[ ], Ösztöndíj Konstruktor (név, neptunkód). Metódusok: setjegyek, JegyBeír, setösztöndíj, Átlag, Juttatás, tostring, jegykiír public class Hallgato extends Szemely { private int [ ] jegyek; private int Osztondij; final static int ALAP = 10000; public Hallgato (String Nev, String Kod){ super(nev, Kod); public void setjegyek(int j){ jegyek = new int[j]; public void JegyBeir(int i, int jegy){ jegyek[i] = jegy; public void setosztondij(int od){ Osztondij = od; 35/20 B IT MAN
Hallgato osztály, szülő: Szemely, adattagok: jegyek[ ], Ösztöndíj Konstruktor (név, neptunkód). Metódusok: setjegyek, JegyBeír, setösztöndíj, Átlag, Juttatás, tostring, jegykiír public double Atlag(){ double atlag = 0d; for (int i=0; i<10; i++) atlag += jegyek[i]; return atlag/10d; public int Juttatas(){ if (Atlag() >= 3) return (int)(atlag()*alap); else return 0; public String tostring(){ return "Név: "+getnev()+", Átlag: "+Atlag()+", Ösztöndíj: "+Osztondij; public void jegykiir(){ for (int i=0; i<10; i++) System.out.println(getNev()+" "+i+". jegye: "+jegyek[i]); 35/21 B IT MAN
HallgatoProgram futtatható osztály 5 hallgató beolvasása tömbbe, 10 jegy generálása hallgatónként, ösztöndíj számítása, hallgatók adatainak kiírása, utolsó hallgató jegyeinek kiírása import java.util.scanner; public class HallgatoProgram { public static void main(string[ ] args) { Scanner sc = new Scanner(System.in); Hallgato [ ] h = new Hallgato[5]; String s1, s2; for (int i=0; i<5; i++){ System.out.println("A hallgató neve: "); s1 = sc.nextline(); System.out.println("A hallgató kódja: "); s2 = sc.nextline(); h[i]= new Hallgato(s1, s2); h[i].setjegyek(10); for (int j=0; j<10; j++){ h[i].jegybeir(j, 1+(int)(Math.random()*5)); h[i].setosztondij(h[i].juttatas()); 35/22 B IT MAN
HallgatoProgram futtatható osztály 5 hallgató beolvasása tömbbe, 10 jegy generálása hallgatónként ösztöndíj számítása, hallgatók adatainak kiírása, utolsó hallgató jegyeinek kiírása for (int i=0; i<5; i++) System.out.println(h[i]); h[4].jegykiir(); 35/23 B IT MAN
Gyakorló példa a számonkérésre 1. Feladat: Készítsen egy Alkoholos nevű interfészt, benne egy mennyialkoholttartalmaz nevű valós eredményt visszaadó metódust 2. Feladat: Készítsen egy Ital nevű osztályt, legyen az adattagja az ital neve Készítsen a névvel inicializáló konstruktort Készítsen getnév metódust Alkosson olyan törzs nélküli metódust, mellyel szövegként visszaadja azt, hogy mibőlkészült az ital Alkosson olyan törzs nélküli metódust, mellyel szövegként visszaadja azt, hogy milyenízű az ital 35/24 B IT MAN
Gyakorló példa a számonkérésre 3. Feladat: Készítse el a Gyümölcslé nevű osztályt, az Ital osztály leszármazottjaként Az osztály adattagként tárolja az alapanyag-ot, és a gyümölcslé ízét Legyen az osztálynak olyan konstruktora, mely a három adattag értékével inicializás (név, alapanyag, íz) Valósítsa meg a szükséges metódusokat Az osztály tostring metódusa a következő formában adjon vissza adatot: Hohes C: nem alkoholos, citrom alapú ital 35/25 B IT MAN
Gyakorló példa a számonkérésre 4. Feladat: Készítse el a AlkoholosItal nevű osztályt, az Ital osztály leszármazottjaként, melyben megvalósítja az Alkoholos interfészt Az osztály adattagként tárolja az alapanyag-ot, és a gyümölcslé ízét, és az alkoholtartalmat (0-1 közötti valós szám) Legyen az osztálynak olyan konstruktora, mely a négy adattag értékével inicializás (név, alapanyag, íz, alkohol) Valósítsa meg a szükséges metódusokat Az osztály tostring metódusa a következő formában adjon vissza adatot: Pálinka: 40.0% alkohol tartalmú ital 35/26 B IT MAN
Gyakorló példa a számonkérésre 5. Feladat: Készítsen egy AbsztinensProgram nevű futtatható osztályt Készítsen egy osztályszintű elfogyaszt nevű metódust, mely egy italt kap paraméterül. Kiírja a kapott ital nevét, és ha az ital alkoholos, akkor a "Köszönöm, nem kérem! Alkoholt tartalmaz!" szöveget, egyébként a "Megittam, finom volt!" szöveget. Hozzon létre egy 4 elemű Ital típusú tömböt Töltse fel 2 Gyümölcslével, és 2 AlkoholosItal-lal Fogyassza el az italokat 35/27 B IT MAN
Gyakorló példa a számonkérésre Futtatási minta: Megkínáltak a következővel: Sió barack: nem alkoholos, barack alapú ital Megittam, finom volt! Megkínáltak a következővel: Sör: 5.0% alkohol tartalmú ital Köszönöm, nem kérem! Alkoholt tartalmaz! Megkínáltak a következővel: Hohes C: nem alkoholos, citrom alapú ital Megittam, finom volt! Megkínáltak a következővel: Pálinka: 40.0% alkohol tartalmú ital Köszönöm, nem kérem! Alkoholt tartalmaz! 35/28 B IT MAN
Alkoholos interfész, mennyialkoholttartalmaz metódus public interface Alkoholos { public double mennyialkoholttartalmaz(); 35/29 B IT MAN
Ital osztály, név adattag, konstruktor, getnév metódus, törzsnélküli mibőlkészült és milyenízű metódusok public abstract class Ital { private String nev; public Ital(String nev) { this.nev = nev; public String getnev(){ return nev; public abstract String mibolkeszult(); public abstract String milyenizu(); 35/30 B IT MAN
Gyümölcslé osztály, szülő: Ital, adattagok: alapanyag, íz Konstruktor (név, alapanyag, íz). Metódusok: milyenízű, mibőlkészült tostring: Sió barack: nem alkoholos, barack alapú ital public class Gyumolcsle extends Ital { private String alapanyag; private String iz; public Gyumolcsle(String nev, String alap, String iz) { super(nev); alapanyag = alap; this.iz = iz; public String milyenizu() { return iz; public String mibolkeszult(){ return alapanyag; public String tostring() { return getnev()+": nem alkoholos, "+alapanyag+" alapú ital"; 35/31 B IT MAN
AlkoholosItal osztály, szülő: Ital, implementálja az Alkoholos interfészt adattagok: alapanyag, íz, alkohol. Konstruktor (név, alapanyag, íz, alkohol). Metódusok: milyenízű, mibőlkészült tostring: Pálinka: 40.0% alkohol tartalmú ital public class AlkoholosItal extends Ital implements Alkoholos { private String alapanyag; private String iz; private double alkoholtartalom; public AlkoholosItal(String nev, String alap, String iz, double alk) { super(nev); alapanyag = alap; this.iz = iz; alkoholtartalom = alk; public String milyenizu() { return iz; public String mibolkeszult(){ return alapanyag; public String tostring() { return getnev()+": "+alkoholtartalom*100+"% "+" alkohol tartalmú ital"; 35/32 B IT MAN
AbsztinensProgram futtatható osztály elfogyaszt osztály metódus, 4 elemű Ital tömb, feltöltés adatokkal, italok elfogyasztása public class AbsztinensProgram { public static void elfogyaszt(ital i) { System.out.println("Megkínáltak a következővel: "+i); if (i instanceof Alkoholos) System.out.println("Köszönöm, nem kérem! Alkoholt tartalmaz!"); else System.out.println("Megittam, finom volt!"); public static void main(string[ ] args) { Ital [ ] ital = new Ital [4]; ital[0] = new Gyumolcsle("Sió barack", "barack", "édes"); ital[1] = new AlkoholosItal("Sör", "komló", "keserű", 0.05); ital[2] = new Gyumolcsle("Hohes C", "citrom", "savanykás"); ital[3] = new AlkoholosItal("Pálinka", "szilva", "szilva", 0.4); for (int i=0; i<4; i++) AbsztinensProgram.elfogyaszt(ital[i]); 35/33 B IT MAN
Konzol Megkínáltak a következővel: Sió barack: nem alkoholos, barack alapú ital Megittam, finom volt! Megkínáltak a következővel: Sör: 5.0% alkohol tartalmú ital Köszönöm, nem kérem! Alkoholt tartalmaz! Megkínáltak a következővel: Hohes C: nem alkoholos, citrom alapú ital Megittam, finom volt! Megkínáltak a következővel: Pálinka: 40.0% alkohol tartalmú ital Köszönöm, nem kérem! Alkoholt tartalmaz! 35/34 B IT MAN
VÉGE VÉGE 35/35 B IT MAN