1 / 34

6. gyakorlat

6. gyakorlat. Fájlkezelés, IO Kivételkezelés Belső osztályok. Fájlkezelés, IO. Java IO. adatfolyam alapú megközelítés (stream-ek) InputStream/OutputStream: byte-orientált IO InputStream: adatforrás-folyam OutputStream: adatnyelő-folyam

Télécharger la présentation

6. gyakorlat

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


  1. 6. gyakorlat Fájlkezelés, IO Kivételkezelés Belső osztályok

  2. Fájlkezelés, IO

  3. Java IO • adatfolyam alapú megközelítés (stream-ek) • InputStream/OutputStream: byte-orientált IO • InputStream: adatforrás-folyam • OutputStream: adatnyelő-folyam • Reader/Writer osztályok: karakter-orientált IO unicode támogatással • konvertáló osztályok (pl. InputStreamReader)

  4. Standard IO • standard input: System.in • standard output: System.out • standard error: System.err • a System.out és a System.err közvetlenül használhatók (ahogyan eddig is használtuk őket)

  5. Importálás IO-hoz • importálnunk kell: import java.io.*; • amiket általában használunk belőle (az API-ban utánuk lehet nézni bővebben): • BufferedReader • InputStreamReader • FileReader • FileWriter

  6. Billentyűzetről beolvasás • BufferedReader: szöveget olvas a karakter input-streamről • InputStreamReader: byte-okat olvas, majd karakterekké alakítja őket BufferedReader be = new BufferedReader(new InputStreamReader(System.in)); be.read(); be.readLine();

  7. Billentyűzetről beolvasás • read(): egyetlen karaktert olvas be, és az ASCII kódjával tér vissza • readLine(): egy sort olvas be, és a beolvasott sztringgel tér vissza

  8. Beolvasás fájlból • FileReader: karakteres fájlokat olvas • konstruktorában egy File objektumot vár • readLine(): egy sort olvas be a fájlból BufferedReader be = new BufferedReader(new FileReader(new File(”fajlnev.txt”))); be.readLine();

  9. Kiíratás fájlba • FileWriter: karakteres fájlokat ír • szintén át kell adnunk neki egy File objektumot FileWriter ki = new FileWriter(new File(”uj.txt”)); ki.write(”szöveg”); • az IO műveletek végén a stream-eket zárjuk le! • be.close(); • ki.close();

  10. Példaprogram • Fajlkezeles.zip (honlapomon)

  11. Kivételkezelés

  12. Kivételkezelés fogalmai • nem derül ki minden hiba a fordítás során • kivétel: egy probléma, mely meggátolja a futást egy adott metódusban/blokkban • pl. null referencia • kivétel dobása: • az aktuális program végrehajtása megáll, kivétel „dobódik” • a kivételkezelő mechanizmus keres egy megfelelő kivételkezelőt • a kivételkezelő lekezeli a hibát, a program futása folytatódik

  13. Kivételkezelés fogalmai • kivétel elkapása: • ha valahol kivétel dobódik, akkor feltételezzük, hogy az valahol el lesz kapva • védett régió: • a kód azon része, mely kivételeket hozhat létre • hibakezelő kód követi try{ … } catch{ … }

  14. Kivételkezelés try { … } catch (NullPointerException e) { … } „veszélyes kód”: kivételt dobhat mi történjen, ha elkaptuk a kivételt?

  15. Exception osztály • a kivételek mind az Exception osztályból származnak • néhány példa kivételekre: • ClassNotFoundException • DataFormatException • IOException • SQLException • ArithmeticException (pl. nullával osztás) • ArrayIndexOutOfBoundsException (tömbindexelési hibák) • FileNotFoundException • RuntimeException • …

  16. Try, catch, finally • több catch blokk is lehet try { ... } catch (ArithmeticException e){ … } catch (IOException e){ … } catch (Exception e){ … } finally { … } • sorba nézzük a catch ágakat, mindegyiknél az adott hibát tudjuk elkapni amit a finally-ba írok, az mindenképpen lefut (függetlenül attól, dobódik-e kivétel vagy nem)

  17. Try, catch, finally • catch (Exception e): általános kivételelkapó • a finally ág nem kötelező, de hasznos lehet stream-ek vagy kapcsolatok lezárásához, mert így mindenképpen lezárjuk őket • pl. ki.close();

  18. RuntimeException • azon kivételek őse, amiket a virtuális gép dobhat a normál működése közben • ezen osztályból származó kivételeket nem feltétlen kell elkapni, mert ha bekövetkeznek, akkor se tudunk sok mindent kezdeni velünk (a program úgyis meghal) • ilyen pl. a NullPointerException, ArrayIndexOutOfBoundsException

  19. Throwable osztály • az Object osztályból származik ez is • két leszármazottja van: • Exception: erről volt szó eddig • Error: fordítási időbeni- és rendszerhibák, ezekkel általában nem kell foglalkozni

  20. Throws kulcsszó • ezzel jelzem, hogy valami (általában metódus) dobhat kivételt, viszont a kivételt nem kapom el (vagy máshol kapom el) public void beolvas() throws IOException{ } • sok esetben le sem lehet fordítani a programot a throws nélkül

  21. Saját kivétel létrehozása • származtatni kell valamilyen létező kivétel osztályból public class SajatKivetel extends Exception{ public SajatKivetel(String message){ super(message); } }

  22. Throw kulcsszó • kivételt dobhatunk vele (manuálisan) • Pl.: if (x<0) throw new SajatKivetel(„X negatív.”); • ne keverjük a throws kulcsszóval, ami annak jelzésére szolgál, hogy egy metódus milyen kivételt dobhat! • ha saját kivételt dobunk, azt jeleznünk kell a „throws” kulcsszóval, vagy try-catch segítségével kell lekezelni • ha egyiket se tesszük, fordítási hibát fogunk kapni

  23. throws vs. throw public static void main(String args[]) throws SajatKivetel{ int a=3; int b=0; if(b==0)throw new SajatKivetel(„Nulla az osztó”); else System.out.println((float)a/b); } jelezzük, hogy dobhat ilyen kivételt b=0 esetén ténylegesen dobjuk is a kivételt

  24. Példaprogramok • SajatKivetel.java (pub, 8. gyakorlat) • Hiba.java (pub, 8. gyakorlat)

  25. Belső osztályok

  26. Belső osztályok • osztályon vagy metóduson belüli osztályok • cél: máshol nem használt algoritmus teljes elrejtése • a belső osztályból elérhetők a „körülvevő” osztály elemei • kivéve ha a belső osztály static • egy (nem belső) osztály láthatósága csak public vagy package private lehet, a belső osztály viszont ezen felül lehet private, protected, sőt static is • nem kell őket külön fordítani

  27. Példa belső osztályra • osztályon belüli belső osztály: public class Kulso{ … private class Belso{…} … }

  28. Példa belső osztályra • metóduson belüli belső osztály: public void csinalValamit(){ … private class Belso(){…} … }

  29. Belső osztály példányosítása • a tartalmazón belül ugyanúgy, mint eddig • a tartalmazón kívülről: Kulso.Belso peldany = new Kulso.Belso(); • csak nemstatikus belső osztály esetén: Kulso peldanyKulso = new Kulso(); Kulso.Belso púeldanyBelso = peldanyKulso.new Belso();

  30. Példaprogramok • Lista.java (pub, 8. gyakorlat) • Lmain.java (pub, 8. gyakorlat)

  31. Gyakorló feladatok • pub: 8. gyakorlathoz tartozó feladatok.txt

  32. Szorgalmi feladat • szerda éjfélig küldhető el 3 pluszpontért nekem e-mailben Feladat: • Írj három saját hiba osztályt: mindegyik származzon az Exception osztályból, legyen default és paraméteres konsturktoruk is, ezekben az Exception osztály default, valamint az 1 db String argumentumot váró konstruktorát hívd meg • az egyik az InvalidYearException osztály: a default konstruktorban az "Érvénytelen évszám!„ szöveget add át az ős konstruktorának, a paraméteresben értelemszerűen a kapott String típusú paramétert • Legyen ugyanilyen módon létrehozva az InvalidCitizenshipException és a TooLongNameException osztály is (itt a default konstruktor a "Nem magyar állampolgár„ és a „Túl hosszú a név!” szövegeket adja át az ős konstruktorának) • Mindhárom osztály kerüljön a kivetelkezeles, azon belül a sajatkivetelek csomagba

  33. Szorgalmi feladat • Írj egy Állampolgár osztályt, legyen a kivetelkezeles csomagban: adattagjai az adószám (egész), a név, az évszám (egész szám) és az állampolgárság (String, pl. „magyar”, „német”…) • Írj hozzá paraméteres konstruktort, mely 4 paramétert vár. A konstruktorban ellenőrizd: • hogy az évszám pozitív-e, ha nem, akkor dobj InvalidYearExceptiont • hogy a név hossza nagyobb-e 35-nél, ha igen, akkor dobj TooLongNameExceptiont a következő szöveggel: "A név túl hosszú: x karakter. Maximum 35 karakter lehet.„ (x nyilván az aktuálisan átadott paraméter hossza) • hogy az állampolgárság értéke a „magyar”-e, amennyiben nem, dobj InvalidCitizenshipExceptiont a következő szöveggel: "Hiba: az adatbázis csak magyar állampolgárságú személyek adatait tartalmazhatja!„ • Írj hozzá getter-setter metódusokat, a fentebb említett ellenőrzések a megfelelő setterekben is történjenek meg, valamint a hibadobás is

  34. Szorgalmi feladat • A hibadobást jelezd a throws kulcsszó segítségével a megfelelő metódusok deklarációjában, a hibát elkapni az osztályban sehol sem kell • Írj egy KivételPélda osztályt, legyen ez is a kivetelkezeles csomagban: • Próbálj létrehozni állampolgár objektumokat, valamint a setterek segítségével átállítani az adattagjaikat (ez veszélyes kód, kezeld ennek megfelelően) • A keletkező hibákat kapd el, és az e.printStackTrace() hívásával írasd ki a konzolra a megfelelő információkat a hibáról • Ne felejtsd el importálni a saját hiba osztályaidat!

More Related