Függvények, csomagok Csomagok Az osztályok csomagokba vannak rendezve, minden csomag tetszőleges számú osztályt tartalmazhat Pl.: java.util.scanner Könyvtárhierarhiát fed: Pl.: java/util/scanner.java Célja: modularizáció, névütközések feloldása, hozzáférés szabályozás Használat 1: 1. A java.lang csomagban lévő osztályok minden további nélkül használhatóak 2. Azt, hogy egy adott osztály amit használni akarunk melyik csomagban van, az import kulcsszó után kell megadni az osztály deklaráció elött. Pl.: import java.util.scanner vagy import java.util.* 3. Hivatkozás fully qualified classname-el: java.util.scanner sc =... Használat 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építés (idáig) // package deklaráció: opcionális package package.nev; // import deklarációk: opcionális import java.util.scanner; 1
// public nélkül, akárhány lehet belole (akár egy sem) class ClassNev{ {metodusok+ // public deklarációval, pontosan egy darabnak kell lennie, // a filenévnek az osztály nevének kell lennie public class ClassNev{ {metodusok+ Metódusok: függvények, eljárások Általános prototípus: <módosítószavak> <visszatérési érték> <név>( <paraméterek listája> ) [ throws <kivétel lista> ] { <utasítás1>; <utasítás2>; Paraméter átadás érték szerint történik, az átadott paraméter a hívott metódus lokális változójaként viselkedik. A hívott metódus akár meg is változtathatja annak értékét, de a változások nem jutnak vissza a hívás helyére. Fontos: Objektumoknál referencia adódik át érték szerint. Módosítószavak: Láthatóság: public, protected, private. Ha nem definiált, akkor ún. package-private láthatóság. Lehet abstract: ekkor nincs implementáció, leszármazottban kötelezően felüldefiniálandó Lehet final: felüldefiniálhatóság letiltására Lehet static: osztály szintű függvény (Fontos: static kontextusból csak static módosítóval ellátott hivatkozás szerepelhet) Visszatérési érték szerinti csoportosítás: void: eljárás Minden egyéb: függvény Szignatúra: a függvény paramétereinek száma és típusa Overloading: lehet két azonos nevű metódus, ha eltérő a szignaturája 2
Kivételkezelés Figure 1: Exception hierarhia Általános forma: try { // Kritikus utasitasok catch (Exception1 e1) { catch (Exception2 e2) { finally { Alapvetően három típusú kivétel: 1. Felügyelt kivételek: definiálni kell őket a függvényben, és ha definiáltak, le is kell őket kezelni (ősosztály: java.lang.exception, pl. java.lang.classnotfoundexception, java.io.ioexception) 2. Nem felügyelt kivételek: nem kötelező sem difiniálni, sem lekezelni őket (ősosztály: java.lang.runtimeexception, pl. ArrayIndexOutOfBoundsException, NumberFormatException, DivisionByZeroException) 3. Léteznek még Error-ok, ezek a Throwable leszármazottai. Kritikus esetben fordulnak elő, a legtöbb esetben a lekezelésük is felesleges (pl. OutOfMemoryError, StackOverflowError) 3
Egyszerű kivételkezelés (ismétlés) 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(); Összetett példa // 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észletesen exceptions/ http://download.oracle.com/javase/tutorial/essential/ File Input // A következo két 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észítsünk egy egyszerű l33t5p34k (leetspeak) generátort! A program 1 parancssori argumentumot kapjon: egy input fájl elérési utat. A program olvassa be az inputot fájlt, és minden szón végezze el a következő módosításokat, majd írja ki a képernyőre a módosított szöveget: Minden 2. karakter esetén a kisbetűből csináljon nagyot, a nagybetűből kicsit! a -> @ e -> 3 i -> 1 o -> 0 5
u -> v f -> ph s -> $ g -> 9 y -> j t -> +! -> 1 Ha az utolsó karakter: s -> z ck -> x Legyen teljes hibakezelés (fájl nem található, nem kap fájlnevet a parancssorban, stb.)! A megoldás legyen a LeetSpeak osztályban a leet csomagban. Gyakorló feladatok 1. Feladat Készítsünk egy új osztályt PerfectNumbersChecker névvel. Az osztály kerüljön a perfect csomagba. Írjunk az osztályban egy függvényt isperfectnumber névvel, ami elvégzi az első órai tökéletes szám feladatot. Ezután hívjuk meg ezt a függvényt a main fv-ből, majd írassuk ki az általa visszaadott eredményt. Amennyiben a függvény paramétere <= 1, akkor a függvény dobjon egy kivételt a következő üzenettel: Az intervallum felső határa nagyobb kell, hogy legyen, mint 1!. 2. Feladat Készítsetek egy függvényt, amely megadja egy másodfokú egyenlet gyökeit! A függvény definíciója legyen a következő: private static double[] sqroots(double a, double b, double c) { // A függvény dobjon nem ellenőrzött és ellenőrzött kivételeket is (pl. IllegalArgumentException és egy saját), ha a == 0, vagy a diszkrimináns negatív! A függvény által dobott kivételeket kezeld is le a main() függvényben! 6
3. Feladat Készítsünk egy Sudoku ellenörző programot! A program inputja egy fájl, amelynek soraiban pontosan 81 karakter található, és egy-egy Sudoku sorfolytonos ábrázolását jelenti. A program írja ki a képernyőre az érvényes kitöltést tartalmazó sorokat! Példa input fájl sorok: 123456789123456789123456789123456789123456789123456789123456789123456789123456789 123456789234567891345678912456789123567891234678912345891234567891234567912345678 Sudoku: Egy 9 x 9 négyzetből álló nagy négyzetben kell elhelyezni a számokat 1-től 9-ig úgy, hogy egy tetszőleges sorban, oszlopban és háromszor hármas négyzetben mindegyik szám csupán egyszer forduljon elő. http://hu.wikipedia.org/wiki/sz%c3%badoku 7