F¨ uggv´ enyek, csomagok Csomagok • Az oszt´ alyok csomagokba vannak rendezve, minden csomag tetsz˝oleges sz´ am´ u oszt´ alyt tartalmazhat • Pl.: java.util.Scanner • K¨ onyvt´ arhierarhi´ at fed: Pl.: java/util/Scanner.java • C´elja: modulariz´ aci´ o, n´ev¨ utk¨oz´esek felold´asa, hozz´af´er´es szab´alyoz´as • Haszn´ alat 1: 1. A java.lang csomagban l´ev˝o oszt´alyok minden tov´abbi n´elk¨ ul haszn´ alhat´ oak 2. Azt, hogy egy adott oszt´aly amit haszn´alni akarunk melyik csomagban van, az import kulcssz´o ut´an kell megadni az oszt´aly deklar´aci´o el¨ ott. Pl.: import java.util.Scanner vagy import java.util.* 3. Hivatkoz´ as fully qualified classname-el: java.util.Scanner sc = . . . • Haszn´ alat 2: package hello; /** * Hello world program. */ public class HelloWorld { public static void main(String[] args) { System.out.println("Hello World!"); } } javac hello/HelloWorld.java java hello.HelloWorld
JAVA file fel´ ep´ıt´ es (id´ aig) // package deklar´ aci´ o: opcion´ alis package package.nev; // import deklar´ aci´ ok: opcion´ alis import java.util.Scanner; 1
// ‘public‘ n´ elk¨ ul, ak´ arh´ any lehet bel} ole (ak´ ar egy sem) class ClassNev{ {metodusok}+ } // ‘public‘ deklar´ aci´ oval, pontosan egy darabnak kell lennie, // a filen´ evnek az oszt´ aly nev´ enek kell lennie public class ClassNev{ {metodusok}+ }
Met´ odusok: f¨ uggv´ enyek, elj´ ar´ asok ´ • Altal´ anos protot´ıpus: <m´ odos´ ıt´ oszavak>
( <param´ eterek list´ aja> ) [ throws ] { ; ; ... } • Param´eter ´ atad´ as ´ert´ek szerint t¨ort´enik, az ´atadott param´eter a h´ıvott met´ odus lok´ alis v´ altoz´ojak´ent viselkedik. A h´ıvott met´odus ak´ar meg is v´ altoztathatja annak ´ert´ek´et, de a v´altoz´asok nem jutnak vissza a h´ıv´as hely´ere. Fontos: Objektumokn´al referencia ad´odik ´at ´ert´ek szerint. • M´ odos´ıt´ oszavak: – L´ athat´ os´ ag: public, protected, private. Ha nem defini´alt, akkor u ´n. package-private l´athat´os´ag. – Lehet abstract: ekkor nincs implement´aci´o, k¨ otelez˝ oen fel¨ uldefini´aland´o
lesz´armazottban
– Lehet final: fel¨ uldefini´alhat´os´ag letilt´as´ara – Lehet static: oszt´aly szint˝ u f¨ uggv´eny (Fontos: static kontextusb´ol csak static m´ odos´ıt´oval ell´atott hivatkoz´as szerepelhet) • Visszat´er´esi ´ert´ek szerinti csoportos´ıt´as: – void: elj´ ar´ as – Minden egy´eb: f¨ uggv´eny • Szignat´ ura: a f¨ uggv´eny param´etereinek sz´ama ´es t´ıpusa • Overloading: lehet k´et azonos nev˝ u met´odus, ha elt´er˝o a szignatur´aja 2
Kiv´ etelkezel´ es
Figure 1: Exception hierarhia ´ Altal´ anos forma: try { ... // Kritikus utasitasok } catch (Exception1 e1) { ... } catch (Exception2 e2) { ... } finally { } Alapvet˝ oen h´ arom t´ıpus´ u kiv´etel: 1. Fel¨ ugyelt kiv´etelek: defini´alni kell ˝oket a f¨ uggv´enyben, ´es ha defini´altak, le is kell ˝ oket kezelni (˝ososzt´aly: java.lang.Exception}, pl. java.lang.ClassNotFoundException, java.io.IOException) 2. Nem fel¨ ugyelt kiv´etelek: nem k¨otelez˝o sem difini´alni, sem lekezelni ˝oket (˝ ososzt´ aly: java.lang.RuntimeException, pl. ArrayIndexOutOfBoundsException, NumberFormatException, DivisionByZeroException) 3. L´eteznek m´eg Error-ok, ezek a Throwable lesz´armazottai. Kritikus esetben fordulnak el˝ o, a legt¨obb esetben a lekezel´es¨ uk is felesleges (pl. OutOfMemoryError, StackOverflowError) 3
Egyszer˝ u kiv´ etelkezel´ es (ism´ etl´ es) public static void main(String[] args) { try { int res = Integer.parseInt(args[0]); // ... } catch (NumberFormatException nfe) { System.err.println("Hibas input: " + args[0]); nfe.printStackTrace(); } } ¨ Osszetett p´ elda // Egyszerubb forma, ha nem akartok uzeneteket //class ZeroParameterException extends Exception {} class ZeroParameterException extends Exception { public ZeroParameterException() { super(); } public ZeroParameterException(final String msg) { super(msg); } } public class ExExample { static double divide(int a, int b) throws ZeroParameterException { if (0 == b) { throw new ZeroParameterException("b erteke nem lehet 0!"); } return (double) a / b; } public static void main(String[] args) { try { double res = divide(1, 0); } catch (ZeroParameterException e) { System.err.println(e.getMessage()); } catch (Exception e) { System.err.println(e.getMessage()); } finally { 4
System.err.println("vege"); } } } R´ eszletesen http://download.oracle.com/javase/tutorial/essential/ exceptions/
File Input // A k¨ ovetkez} o k´ et import helyett lehet: // import java.io.* import java.io.File; import java.io.FileNotFoundException; import java.util.Scanner; ... public class FileInput{ public static void main(String[] args) throws FileNotFoundException { File f = new File("filename"); Scanner sc = new Scanner(f); ... } }
+/- Feladatok K´esz´ıts¨ unk egy egyszer˝ u l33t5p34k (leetspeak) gener´atort! A program 1 parancssori argumentumot kapjon: egy input f´ajl el´er´esi utat. A program olvassa be az inputot f´ ajlt, ´es minden sz´on v´egezze el a k¨ovetkez˝o m´odos´ıt´asokat, majd ´ırja ki a k´eperny˝ ore a m´ odos´ıtott sz¨oveget: • Minden 2. karakter eset´en a kisbet˝ ub˝ol csin´aljon nagyot, a nagybet˝ ub˝ol kicsit! • “a” -> “@” • “e” -> “3” • “i” -> “1” • “o” -> “0” 5
• “u” -> “v” • “f” -> “ph” • “s” -> “$” • “g” -> “9” • “y” -> “j” • “t” -> “+” • “!” -> “1” • Ha az utols´ o karakter: – “s” -> “z” – “ck” -> “x” Legyen teljes hibakezel´es (f´ ajl nem tal´alhat´o, nem kap f´ajlnevet a parancssorban, stb.)! A megold´ as legyen a LeetSpeak oszt´alyban a leet csomagban.
Gyakorl´ o feladatok 1. Feladat K´esz´ıts¨ unk egy u ´j oszt´ alyt PerfectNumbersChecker n´evvel. Az oszt´aly ker¨ ulj¨on a perfect csomagba. ´Irjunk az oszt´alyban egy f¨ uggv´enyt isPerfectNumber n´evvel, ami elv´egzi az els˝ o ´ orai t¨ok´eletes sz´am feladatot. Ezut´an h´ıvjuk meg ezt a f¨ uggv´enyt a main fv-b˝ ol, majd ´ırassuk ki az ´altala visszaadott eredm´enyt. Amennyiben a f¨ uggv´eny param´etere <= 1, akkor a f¨ uggv´eny dobjon egy kiv´etelt a k¨ ovetkez˝ ou ¨zenettel: “Az intervallum fels˝o hat´ara nagyobb kell, hogy legyen, mint 1!”. 2. Feladat K´esz´ıtsetek egy f¨ uggv´enyt, amely megadja egy m´asodfok´ u egyenlet gy¨okeit! A f¨ uggv´eny defin´ıci´ oja legyen a k¨ovetkez˝o: private static double[] sqroots(double a, double b, double c) { // ... } A f¨ uggv´eny dobjon nem ellen˝ orz¨ ott ´es ellen˝ orz¨ ott kiv´eteleket is (pl. IllegalArgumentException ´es egy saj´at), ha a == 0, vagy a diszkrimin´ans negat´ıv! A f¨ uggv´eny ´ altal dobott kiv´eteleket kezeld is le a main() f¨ uggv´enyben! 6
3. Feladat K´esz´ıts¨ unk egy Sudoku ellen¨orz˝o programot! A program inputja egy f´ajl, amelynek soraiban pontosan 81 karakter tal´alhat´o, ´es egy-egy Sudoku sorfolytonos abr´ ´ azol´ as´ at jelenti. A program ´ırja ki a k´eperny˝ore az ´erv´enyes kit¨olt´est tartalmaz´ o sorokat! P´elda input f´ ajl sorok: 123456789123456789123456789123456789123456789123456789123456789123456789123456789 123456789234567891345678912456789123567891234678912345891234567891234567912345678 Sudoku: Egy 9 x 9 n´egyzetb˝ol ´all´o nagy n´egyzetben kell elhelyezni a sz´ amokat 1-t˝ ol 9-ig u ´gy, hogy egy tetsz˝oleges sorban, oszlopban ´es h´ aromszor h´ armas n´egyzetben mindegyik sz´am csup´an egyszer forduljon el˝ o. http://hu.wikipedia.org/wiki/Sz%C3%BAdoku
7