Programozási nyelvek II.: JAVA

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

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

Segédanyag: Java alkalmazások gyakorlat

Programozási nyelvek Java

Java gyakorlat feladatai e s megolda sai ( )

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

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

Programozási nyelvek Java

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

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

Programozási nyelvek Java

7. K: JAVA alapok Konzultáció

Abstract osztályok és interface-ek. 7-dik gyakorlat

Pénzügyi algoritmusok

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

Programozási nyelvek II.: JAVA

Programozás C++ -ban 2007/7

Programozási nyelvek II.: JAVA, 4. gyakorlat

Programozási technológia

Java IX. telkezelés a Java-ban

Java IX. telkezelés a Java-ban

Programozási nyelvek II.: JAVA

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

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

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

Java programozási nyelv 10. rész Input/output kezelés

Java és web programozás

Java és web programozás

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

Java és web programozás

Programozás alapjai gyakorlat. 4. gyakorlat Konstansok, tömbök, stringek

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?

Informatika terméktervezőknek

Osztályok. 4. gyakorlat

Programozási nyelvek II.: JAVA, 4. gyakorlat

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

HORVÁTH ZSÓFIA 1. Beadandó feladat (HOZSAAI.ELTE) ápr 7. 8-as csoport

Programozási nyelvek Java

Objektumorientált programozás C# nyelven

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

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

Objektumorientált programozás C# nyelven

Objektumorientált programozás C# nyelven

Programozási nyelvek II.: JAVA

JAVA PROGRAMOZÁS 8.ELŐADÁS

OOP: Java 1.Gy: Java alapok

Szoftvertechnológia alapjai Java előadások

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

Bevezetés a programozásba I 10. gyakorlat. C++: alprogramok deklarációja és paraméterátadása

Kalapácsvetés 2016 szöveges

Java és web programozás

INFORMATIKAI ALAPISMERETEK

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

Programozás I. Második ZH segédlet

OOP: Java 11.Gy: Enumok, beágyazott osztályok. 13/1 B ITv: MAN

Globális operátor overloading

A függvények névvel rendelkező utasításcsoportok, melyeknek információkat adhatunk át, és van egy visszatérési értékük.

Pelda öröklődésre: import java.io.*; import java.text.*; import java.util.*; import extra.*;

Programozás. (GKxB_INTM021) Dr. Hatwágner F. Miklós május 6. Széchenyi István Egyetem, Gy r

4. Gy: JAVA osztályok

Segédanyag: Java alkalmazások gyakorlat

SQL*Plus. Felhasználók: SYS: rendszergazda SCOTT: demonstrációs adatbázis, táblái: EMP (dolgozó), DEPT (osztály) "közönséges" felhasználók

BME MOGI Gépészeti informatika 8.

Java és web programozás

OOP #14 (referencia-elv)

A WEB programozása - JSP1 dr.gál Tibor őszi félév

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

Programozás III A JAVA TECHNOLÓGIA LÉNYEGE. Többlépcsős fordítás JAVA PLATFORM. Platformfüggetlenség

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

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

Programozási nyelvek és módszerek Java Thread-ek

Programozás 6. Dr. Iványi Péter

Pénzügyi algoritmusok

Java programozási nyelv

Objektumorientált programozás C# nyelven III.

Programozás I. Második ZH segédlet

Imperatív programozás

Delphi programozás I.

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

Python tanfolyam Python bevezető I. rész

Bánsághi Anna

C++ programozási nyelv

3. Gyakorlat Ismerkedés a Java nyelvvel

OOP: Java 8.Gy: Gyakorlás

1. Alapok. Programozás II

JNDI - alapok. Java Naming and Directory Interface

Objektum Orientált Programozás. 5. JAVA osztályok 21/1B IT MAN

Segédanyag: Java alkalmazások gyakorlat

Sikeres végrehajtás(pass): ez azt jelenti, hogy a teszt rendben lefutott, és az ellenőrzési feltételek mind teljesültek.

7. gyakorlat Sorozatok, Fájlkezelés

Programozás II. 2. gyakorlat Áttérés C-ről C++-ra

Objektumorientált Programozás VI.

Programozás C++ -ban

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

Bevezetés a programozásba I.

Se S r e ial a iza z t a ion o n (in n Ja J v a a v ) a Szerializáció

A függvény kód szekvenciáját kapcsos zárójelek közt definiáljuk, a { } -ek közti részt a Bash héj kód blokknak (code block) nevezi.

Programozási nyelvek II. JAVA

Concurrency in Swing

Hello World Servlet. Készítsünk egy szervletet, amellyel összeadhatunk két számot, és meghívásakor üdvözlőszöveget ír a konzolra.

Átírás:

Programozási nyelvek II.: JAVA 5. gyakorlat 2017. október 9-13. 5. gyakorlat Programozási nyelvek II.: JAVA 1 / 34

Az 5. gyakorlat tematikája Kivételkezelés alapjai Be és kimenet BufferedReader, Scanner PrintWriter 5. gyakorlat Programozási nyelvek II.: JAVA 2 / 34

Mi is az a kivételkezelés? Kivételes események kezelése, mikor a program normális utasításfolyama megszakad. Amikor az esemény bekövetkezik egy metódusban, az eljárás létrehoz, dob egy különleges kivétel objektumot, és átadja azt a futtató környezetnek, a Java virtuális gépnek. A virtuális gép ezután megpróbál a hívási lánc mentén találni valamilyen kivételkezelési eljárást, melyet meghívhat. Amennyiben nincs ilyen metódus, és a hívási lánc mentén eljutunk a main metódusig, ahol szintén nem kerül lekezelésre a kivétel, akkor a futás megszakad. 5. gyakorlat Programozási nyelvek II.: JAVA 3 / 34

Példa Main // Main.java public class Main { public static void main ( String [] args ) { int i = Integer. parseint ( args [0]); print ( args [1], i); public static void print ( String text, int times ) { Repeater repeater = new Repeater (); // repeater.text = text; repeater. println ( times ); 5. gyakorlat Programozási nyelvek II.: JAVA 4 / 34

Példa Repeater // Repeater.java public class Repeater { public String text = null ; public void println ( int times ) { text = text. trim (); // white space levágása a szöveg elejéről és végéről for ( int i = 0; i < times ; ++ i) { System. out. println ( text ); 5. gyakorlat Programozási nyelvek II.: JAVA 5 / 34

Példa Futtatás $ javac Main. java $ java Main 10 hello Exception in thread " main " java. lang. NullPointerException at Repeater. println ( Repeater. java :6) at Main. print ( Main. java :13) at Main. main ( Main. java :5) 5. gyakorlat Programozási nyelvek II.: JAVA 6 / 34

Példa Magyarázat Mivel a repeater objektum text mezőjét null értékűnek hagytuk, az objektumszintű trim metódus hívása NullPointerExceptiont váltott ki, hiszen a null referenciához nem tartozik objektum, nem tudjuk min meghívni a metódust. Mivel a kivételt nem kezeltük le, az egészen a main metódusig jutott, onnét pedig továbbszivárogva leállította a program futását. Ilyenkor a virtuális gép információt ad a kivételről, mint láttuk. 5. gyakorlat Programozási nyelvek II.: JAVA 7 / 34

Hívási lánc (stack trace) Exception in thread " main " java. lang. NullPointerException at Repeater. println ( Repeater. java :6) at Main. print ( Main. java :13) at Main. main ( Main. java :5) A legfelső sor azt a metódust és azon belül azt a sort adja meg a kódban, ahol a kivétel keletkezett. A további sorok azt, hogy az eggyel fentebb lévő metódust honnan hívtuk, mikor a kivétel keletkezett. A változók értékéről ebből nem kapunk információt, ahhoz más megoldást kell keresnünk, például debuggert vagy logolást. 5. gyakorlat Programozási nyelvek II.: JAVA 8 / 34

Kivételkezelés!= hibakezelés Figyelem! A kivételkezelés nem azonos a hibakezeléssel. Bár leggyakrabban erre a célra használjuk, egy kivételes esemény nem feltétlenül hiba. Például ha meg akarunk nyitni egy fájlt, mely nem létezik a fájlrendszeren, kivételt kapunk, viszont ez a konkrét feladattól függ, hogy hibának minősül-e. Ha mondjuk a fájl jelentené a programunk bemenetét, akkor a fájl hiánya valóban hiba. Ha viszont valamilyen konfigurációs fájlt töltenénk be a program futása elején, a fájl hiánya esetén létrehozhatjuk az alapértelmezett beállításokkal. A hibakezelésre Java-ban legtöbbször kivételeket használunk. 5. gyakorlat Programozási nyelvek II.: JAVA 9 / 34

Kivételek tehát Nem a fő végrehajtási ág. Logikailag alacsonyabb rendű, nem az adott problémát megoldó algoritmushoz kapcsolódó hiba, vagy a feladat megoldásához közvetlen nem kötődő, ritkán bekövetkező speciális esemény. pl. nullával való osztás, tömb túlindexelése, hálózati kapcsolat hibája, hiányzó fájl, castolási hiba, hibás számformátum, ha Stringet számmá alakítanánk. 5. gyakorlat Programozási nyelvek II.: JAVA 10 / 34

Kivételek lekezelése try { //... catch ( ExceptionType1 e) { //... catch ( ExceptionType2 e) { //... /*... */ catch ( ExceptionTypeN e) { //... finally { //... 5. gyakorlat Programozási nyelvek II.: JAVA 11 / 34

Kivételek lekezelése 2. A try blokkba írjuk a védendő kódot, azt, amelyik kiválthatja a kivételt. Ezt egy vagy több catch ág követi, melyek kódja abban az esetben fut le, ha a megadott kivétel kiváltódik a try blokkban (vagy egy onnan meghívott metódusban, ahonnét továbbadásra kerül). Végül egy opcionális finally blokk következik, ezt a Java minden körülmények között lefuttatja, utolsóként. Tehát akkor is, ha a try blokk lefutott, és nem keletkezett kivétel; a try blokkban keletkezett egy kivétel, és az valamelyik catch lekezelte; a try blokkban keletkezett egy kivétel, de azt nem tudtuk lekezelni, és továbbadjuk. 5. gyakorlat Programozási nyelvek II.: JAVA 12 / 34

Kivételek lekezelése Példa public class Main { public static void main ( String [] args ) { try { System. out. println (" Hello, " + args [0] + "!"); catch ( ArrayIndexOutOfBoundsException e) { System. err. println ( " Not enough command line arguments."); // standard error kimenetre írunk finally { System. out. println (" bye "); 5. gyakorlat Programozási nyelvek II.: JAVA 13 / 34

Kivételek lekezelése Példa futtatása $ javac Main. java $ java Main Not enough command line arguments. bye $ java Main World Hello, World! bye 5. gyakorlat Programozási nyelvek II.: JAVA 14 / 34

Java IO Input-output, avagy be- és kimenet. Nem csak fájlok beolvasását és kiírását értjük alatta, számos más módon is kaphat a programunk bemenetet és adhat kimenetet, például konzolon vagy hálózaton át. A Java egy több rétegű IO modellel rendelkezik, mely alkalmas a különböző források és eltérő célok egységes kezelésére. Ebből mi csak a fájlkezelést tekintjük most át. 5. gyakorlat Programozási nyelvek II.: JAVA 15 / 34

Feladat Olvassuk be egy parancssori argumentumként megadott fájl tartalmát, és írjuk ki a képernyőre! Olvassuk be a fájl tartalmát, és írjuk ki egy másik fájlba! 5. gyakorlat Programozási nyelvek II.: JAVA 16 / 34

BufferedReader Először szükségünk lesz egy java.io.file objektumra, mely egy (nem feltétlenül létező) fájlt (vagy könyvtárat) reprezentál a fájlrendszeren. Olyan, mint egy hivatkozás vagy link az adott fájlra, nem ellenőrzi, hogy a cél megvan-e. (Ne felejtsünk el importálni!) String filepath = args [0]; // abszolút vagy relatív út File file = new File ( filepath ); Létrehozunk egy java.io.filereader objektumot, melynek konstruktora paraméterül kapja a File objektumunkat, és megnyitja a fájlt szerkesztésre. Mivel ez egy erőforrást (fájlt) kezelő típus, úgynevezett try-with-resource szerkezetbe ágyazva hozzuk létre, a try kulcsszó után gömbölyű zárójelek között. Így a try blokk elhagyásával az erőforrást (fájlt) a virtuális gép automatikusan elengedi. try ( FileReader reader = new FileReader ( file ) ) { // itt használhatjuk a reader objektumot 5. gyakorlat Programozási nyelvek II.: JAVA 17 / 34

BufferedReader 2. Mivel a FileReader csak alacsony szintű funkcionalitást biztosít, ezért ezt még becsomagoljuk egy java.io.bufferedreader objektumba, mellyel már tudunk majd soronként beolvasni. try ( FileReader reader = new FileReader ( file ); BufferedReader br = new BufferedReader ( reader ) ){ //... Vagy kicsit egyszerűbben: try ( BufferedReader br = new BufferedReader ( new FileReader ( file )) ){ //... 5. gyakorlat Programozási nyelvek II.: JAVA 18 / 34

BufferedReader Kivételkezelés A fenti kód fordításakor a fordító jelzi nekünk, hogy két kivételt mindenképpen le kell kezelnünk a fájl megnyitásakor. Ez a java.io.filenotfoundexception és a nála általánosabb java.io.ioexception. try ( BufferedReader br = new BufferedReader ( new FileReader ( file )) ){ //... catch ( FileNotFoundException e) { System. err. println (" File does not exist."); catch ( IOException e) { System. err. println ("An IO error occurred."); Mivel az IOException egy általánosabb kivétel, valójában elég lenne csak azt lekezelni. Ekkor FileNotFoundException esetén is az IOExceptiont kezelő catch ág futna le. 5. gyakorlat Programozási nyelvek II.: JAVA 19 / 34

BufferedReader readline A fájlból való beolvasást a BufferedReader paraméter nélküli readline metódusával tudjuk megtenni. Ha nincs több beolvasható sor, nullt ad vissza. try ( BufferedReader br = new BufferedReader ( new FileReader ( file )) ) { String line ; for ( line = br. readline (); line!= null ; line = br. readline ()) { System. out. println ( line ); catch ( FileNotFoundException e) { System. err. println (" File does not exist."); catch ( IOException e) { System. err. println ("An IO error occurred."); 5. gyakorlat Programozási nyelvek II.: JAVA 20 / 34

Scanner Egy másik megoldás a beolvasásra a java.util.scanner osztály használata. Itt nincs szükség FileReader létrehozására, és az IOExceptiont sem kell tudnunk lekezelni, csak a FileNotFoundExceptiont. Cserébe viszont minden sor beolvasása előtt ellenőriznünk kell, hogy van-e még további sor. try ( Scanner sc = new Scanner ( file ) ) { while (sc. hasnextline ()) { String line = sc. nextline (); System. out. println ( line ); catch ( FileNotFoundException e) { System. err. println (" File does not exist."); Vegyük észre, hogy a beolvasó metódus neve is más! (nextline az eddigi readline helyett) 5. gyakorlat Programozási nyelvek II.: JAVA 21 / 34

PrintWriter A fájlokba való kiíratás elég hasonló, csak egy másik osztályra lesz szükségünk, ez a PrintWriter. A konstruktornak itt is egy java.io.file objektumot kell átadnunk. Itt természetesen nem kell, hogy a fájl létezzen, a Java mégis FileNotFoundException kivétellel jelzi, ha a fájl megnyitása vagy létrehozása sikertelen. A fájlba írni a print és println metódusokkal tudunk. A try-with-resource szerkezet használata és így a fájl lezárása itt még fontosabb, mivel anélkül a Java nem valójában írja ki a fájlba a sorokat, csak a memóriában tárolja őket. Megjegyzés: Alternatív megoldásként a flush metódussal írathatjuk ki a sorokat. 5. gyakorlat Programozási nyelvek II.: JAVA 22 / 34

PrintWriter - 2. String [] linestowrite = //... try ( PrintWriter pw = new PrintWriter ( file ) ) { for ( String line : linestowrite ) { pw. println ( line ); catch ( FileNotFoundException e) { System. err. println (" File cannot be opened."); 5. gyakorlat Programozási nyelvek II.: JAVA 23 / 34

Beolvasás fájlból, és kiíratás egy másikba (teljes kód) import java.io.*; public class FileCopy { public static void main ( String [] args ) {... if ( args. length < 2) { System. err. println ( " Not enough command line arguments."); String infilename = args [0]; String outfilename = args [1]; File infile = new File ( infilename ); File outfile = new File ( outfilename ); 5. gyakorlat Programozási nyelvek II.: JAVA 24 / 34

Beolvasás fájlból, és kiíratás egy másikba (teljes kód) 2.... try ( BufferedReader br = new BufferedReader ( new FileReader ( infile )); PrintWriter pw = new PrintWriter ( outfile ) ) { String line ; for ( line = br. readline (); line!= null ; line = br. readline () ) { pw. println ( line ); catch ( FileNotFoundException e) { System. err. println (" File cannot be opened."); catch ( IOException e) { System. err. println ("An IO error occurred."); 5. gyakorlat Programozási nyelvek II.: JAVA 25 / 34

Throws Ha bizonyos kivételeket egységesen akarunk lekezelni, a metódusnál, melyből tovább akarjuk engedni őket, jeleznünk kell egy throws kulcsszó után. import java.io.*; public class FileCopy2 { public static void main ( String [] args ) { try { String contents = readfromfile ( args [0]); printtofile ( args [1], contents ); catch ( IOException e) { System. err. println ("An IO error occurred.");... 5. gyakorlat Programozási nyelvek II.: JAVA 26 / 34

Throws 2.... private static String readfromfile ( String filename ) throws FileNotFoundException, IOException { try ( BufferedReader br = new BufferedReader ( new FileReader ( new File ( filename ))) ) { String line ; StringBuilder builder = new StringBuilder (); for ( line = br. readline (); line!= null ; line = br. readline () ) {... builder. append ( line ). append ("\n"); return builder. tostring (); 5. gyakorlat Programozási nyelvek II.: JAVA 27 / 34

Throws 3.... private static void printtofile ( String filename, String contents ) throws FileNotFoundException { try ( PrintWriter pw = new PrintWriter ( new File ( filename )) ) { pw. print ( contents ); pw. flush (); 5. gyakorlat Programozási nyelvek II.: JAVA 28 / 34

5. gyakorlat Programozási nyelvek II.: JAVA 29 / 34

Hibajavítás Elérhető ezen a LINKEN egy Java forrásfájl, mely a következő feladatot volna hivatott elvégezni. Javítsd ki a benne található hibákat! A főprogram parancssori argumentumként két fájlnevet kap. Az első fájl tartalmát átmásolja a másodikba, egy megszorítással. A másolás során ha kettő vagy több egymást követő sort talál, melyek karakterről karakterre megegyeznek, akkor ezek közül csak egyet ír ki. 5. gyakorlat Programozási nyelvek II.: JAVA 30 / 34

Soronkénti összegzés A bemeneti fájlunk sorai vesszővel elválasztott egész számokat tartalmaznak. Soronként adjuk össze őket, és írjuk ki egy másik fájlba! Oldjuk meg BufferedReaderrel! Keressünk a String osztályban olyan metódust, mely alkalmas rá, hogy egy speciális karakter (most a vessző) mentén feldarabolja a sorunkat. Feltehetjük, hogy a bemenet formátuma helyes. 5. gyakorlat Programozási nyelvek II.: JAVA 31 / 34

Keresés egy fájlban Egy parancssori argumentumként megadott fájlban keressünk meg egy kapott szövegrészletet! A szövegrészletet kérjük be a felhasználótól a képernyőről. Írjuk ki, hogy hányszor fordult elő a keresett szövegrészlet a fájlban. Ne csak akkor számítsuk találatnak, ha az egész sorral megegyezik, akkor is vegyük figyelembe, ha a sor csak tartalmazza a keresett szövegrészletet! (Keressünk megfelelő metódust a String osztályban!) 5. gyakorlat Programozási nyelvek II.: JAVA 32 / 34

Soronkénti összegzés Scannerrel A bemeneti fájlunk sorai vesszővel elválasztott egész számokat tartalmaznak. Soronként adjuk össze őket, és írjuk ki egy másik fájlba! Oldjuk meg Scannerrel, oly módon, hogy rögtön az egész számokat olvassuk be, egyesével, nem pedig a sorokat daraboljuk fel. Ehhez nézzük meg a Scanner osztály hasnextint, nextint és usedelimiter metódusait. Feltehetjük, hogy a bemenet formátuma helyes. 5. gyakorlat Programozási nyelvek II.: JAVA 33 / 34

Soronkénti összegzés hibás adatokkal A bemeneti fájlunk sorai vesszővel elválasztott egész számokat tartalmaznak. Soronként adjuk össze őket, és írjuk ki egy másik fájlba! A fájl tartalmazhat hibás adatokat (nem számokat), ezeket a program egyszerűen hagyja figyelmen kívül! Oldjuk meg BufferedReaderrel és Scannerrel is. 5. gyakorlat Programozási nyelvek II.: JAVA 34 / 34