EΞΑΙΡΕΣΕΙΣ Η java παρέχει ένα µηχανισµό, τις Εξαιρέσεις (exceptions), για να βρει και να χειριστεί τα λάθη που προκύπτουν κατά τις εργασίες Ι/Ο. Τα σφάλµατα και οι εξαιρέσεις είναι αντικείµενα της κλάσης Throwable στη Java. http://docs.oracle.com/javase/8/docs/api java.lang Class Throwable Η Throwable κλάση περιέχει δύο υποκλάσεις: Exception και Error. Μία υποκλάση της Exception είναι η RuntimeException. Οι κλάσεις, που παράγονται από την Error χρησιµοποιούνται για σηµαντικά λάθη του συστήµατος πχ OutOfMemoryError και για τα οποία ο προγραµµατιστής δεν µπορεί να κάνει κάτι.. Oι κλάσεις που παράγονται από την Exception και την RuntimeException, όπως π.χ. το ArithmeticException, χρησιµοποιούνται για συνηθισµένα λάθη, τα οποία ο προγραµµατιστής µπορεί να τα αντιµετωπίσει! Στόχος είναι να «πιάνουµε» τα σφάλµατα πριν διακοπεί η ροή του προγράµµατος. Όταν συµβεί ένα λάθος στο πρόγραµµα, π.χ. διαίρεση δια του µηδέν, τότε η Java δηµιουργεί αυτόµατα ένα αντικείµενο αυτών των κλάσεων και το ρίχνει (throws) στο πρόγραµµα. Αν το πρόγραµµα δεν το πιάσει (catch), τότε διακόπτεται η ροή του προγράµµατος µε την εµφάνιση ενός µηνύµατος λάθους. Μία µέθοδος που µπορεί να τελειώσει µε εξαίρεση έχει µία πρόταση throws πχ. public static int fact (int n) throws NonPositiveException public static int search (int[ ] a, int x) throws NullPointerException, NotFoundException public Ypallilos(int c) throws IllegalArgumentException Ρίψη (throw) εξαίρεσης [1]
Ρίψη µπορούµε να κάνουµε και εµείς!! µε την εντολή throw. if (c <= 0) throw new NonPositiveException( Num.fact ); Η εντολή throw προκαλεί την προσωρινή διακοπή της εκτέλεσης του προγράµµατος. Στην συνέχεια ελέγχονται οι try και catch διαδοχικά µέσα στο πρόγραµµα εάν η εξαίρεση ταιριάζει και έχει προβλεφθεί. Tεχνική: Εγκλωβίζουµε το κοµµάτι του κώδικα που θα µπορούσε να πετάξει εξαίρεση σε ένα µπλοκ try catch try //Eντολές που µπορεί να πετάξουν εξαίρεση int a=30/0; catch (ArithmeticException e) //Eντολές που θα γίνουν για την αντιµετώπιση του λάθους System.out.println("Diaireses me 0!. Exception"+e); Μπορεί να υπάρχουν και περισσότερα catch µε ένα try, ο έλεγχος περνάει από το πρώτο catch επόµενο µέχρι να βρεθεί το κατάλληλο catch (Exception e) Eντολές finally Εντολές(κάνε αυτό είτε γίνει είτε δε γίνει κάποια από τις παραπάνω εξαιρέσεις) Tαξινοµείτε τα catch από το πιο εξειδικευµένο στο πιο γενικό Μπορείτε να χρησιµοποιείτε το επεξηγηµατικό µήνυµα που αντιστοιχεί σε µια εξαίρεση χρησιµοποιώντας τις µεθόδους της κλάσης throwable π.χ. System.out.println("Exception "+e.getmessage() ); Εφαρµογή ΕΞΑΙΡΕΣΕΙΣ για την κλάση Ypallilos ================================ ΑΡΧΙΚΑ ξεκινήστε Βάλτε δοµητή (µε Αριθµό παιδιών) Βάλτε tostring στον Ypallilos public Ypallilos(int childno) throws IllegalArgumentException if (childno < 0) throw new IllegalArgumentException(); this.childno=childno; Στο κυρίως πρόγραµµα δηµιουργήστε και τυπώστε έναν υπάλληλο µε 4 παιδιά. Κατόπιν δοκιμάστε να δημιουργήσετε ένα υπάλληλο με -2 παιδιά μέσα σε bloc try catch: try y=new Ypallilos(-2); catch (IllegalArgumentException e) System.out.println("Δεν µπορεί να έχει αρνητικά παιδιά : "+ e); System.exit(1); Συνεχίστε µε: public double ypologismossintelestiepidomatos() throws ArithmeticException.. public double ypologismosapodohon(int mina) throws ArrayIndexOutOfBoundsException κτλ. [2]
public class Ypallilos String name; String birthdate; //ΟΙ ΩΡΕΣ ΕΡΓΑΣΙΑΣ ΚΑΙ ΟΙ ΩΡΕΣ ΥΠΕΡΩΡΙΑΣ ΝΑ ΚΑΤΑΧΩΡΟΥΝΤΑΙ ΣΕ ΠΙΝΑΚΑ 12 ΘΕΣΕΩΝ ΜonthHours[] MH; //NEA KΛΑΣΗ, πίνακας µε ώρες/ workinghours και υπερωρίες/overtime ανά µήνα. Σετάρoνται double daywage; //ωροµίσθιο int childno; //αρ. παιδιών double bonusfactor; //υπολογίζεται στην ypologismosapodohon //============ public Ypallilos(int c) throws IllegalArgumentException if (c < 0) throw new IllegalArgumentException(); childno=c; MH=new MonthHours[12]; // //============ MEΘΟ ΟΙ public double ypologismossintelestiepidomatos() throws ArithmeticException if (childno==0) throw new ArithmeticException(); return ((100-(50/childNo))/100.0); //bonusfactor public double ypologismosapodohon(int minas) throws ArrayIndexOutOfBoundsException bonusfactor= ypologismossintelestiepidomatos(); if ((minas<0) (minas>12)) throw new ArrayIndexOutOfBoundsException(); return ( (ΜH[minas].workingHours + ΜΗ[minas]).overtime * daywage * (1 + bonusfactor) ); public int totalworkingηours() throws IllegalArgumentException return 0; // //============SET public void setworkingηours(int[] W) throws IllegalArgumentException public void setovertime(int[] O) throws IllegalArgumentException public void setdate (String d) throws InvalidBirthDateException //dd mm yyyy int dd=integer.parseint(d.substring(0,2)); //.. public class TestYpallilos public static void main(string[] args) throws Exception Ypallilos y; try y=new Ypallilos(-6); catch (IllegalArgumentException e) System.out.println(" εν µπορεί να έχει αρνητικά παιδιά!:"+e); //System.exit(1); y=new Ypallilos(2) ; //.. //TestYpallilos.java [3]
ηµιουργία νέων (δικών µας) κλάσεων, που κληρονοµούν την EXCEPTION : (µε δοµητή, που περιέχει µήνυµα) class InvalidBirthDateException extends Exception public InvalidBirthDateException() //super(); System.out.println("Invalid Date Exception Constructor"); //InvalidBirthDateException class InvalidHoursException extends Exception public InvalidHoursException() //super(); System.out.println("Invalid Overtime Constructor"); ΠΑΚΕΤΑ (Σε αυτήν την άσκηση ΕΝ θα χρησιµοποιήσετε NetBeans ΑΛΛΑ Notepad, JCreator κτλ.) Τις κλάσεις που κατασκευάζουµε µπορούµε να τις οργανώνουµε σε πακέτα. Σε ένα πακέτο βέβαια οργανώνονται σχετικές µεταξύ τους κλάσεις Για να δηµιουργηθεί ένα πακέτο πρέπει να χρησιµοποιήσουµε την package ως πρώτη εντολή κάθε αρχείου, που περιέχει µια ή πιο πολλές κλάσεις του πακέτου. 1. Xρήση τάξεων µε ίδιο όνοµα Mέσα σε ένα φάκελο ΤEST δηµιουργούµε 2 φακέλους Computer και µέσα αρχείο Network.java Τraffic και µέσα αρχείο Network.java καθώς και το κάτωθι αρχείο TestNetwork.java public class TestNetwork public static void main(string args[]) System.out.println( "PAKETA.." ); Computer.Network n1 = new Computer.Network(); Traffic.Network n2 = new Traffic.Network(); System.out.println(n1+"\n"+n2); // TestNetwork.java [4] TestNetwork.java \Network.java \Network.java C:\Documents and Settings\Media Pc\TEST> Mεταγλώττιση javac TestNetwork.java Εκτέλεση java TestNetwork
Πακέτο Computer/ (mkdir Computer) package Computer; public class Network String description; public Network() description="this network carries bits and bytes"; System.out.println( "This is a Data Network" ); Πακέτο Traffic/ public String (mkdir tostring() Τraffic) return description; // TEST\Computer\Network.java package Traffic; public class Network String description; public Network() description="this network is used by vehicles" System.out.println("This is a Traffic Network" ); return description=; //TEST\Traffic\Network.java 2. ηµιουργία Προσωπικών Πακέτων Πακέτο ΤΕΙ / (mkdir TEI). Mέσα στον φάκελλο ΤΕΙ βάζω όλα τα java αρχεία, που θέλω να αποτελέσουν το πακέτο, που λέγεται ΤΕΙ [5]
public class Test public static void main(string args[]) System.out.println( "PAKETO.." ); Informatics i = new Informatics(); Marketing m = new Marketing(); Nursing n = new Nursing(); System.out.println(i+"\n"+m+"\n"+n); // TEI\Test.java public class Informatics return ( "Informatics:'Tmima Pliroforikis' " ); // TEI\Informatics.java public class Nursing return ( "Nursing:'Tmima Nursing' " ); // TEI\Nursing.java Mεταγλώττιση του προγράµµατος (έξω από τον φάκελλο ΤΕΙ) C:\Documents and Settings\Media Pc\JavaPack > javac TEI\Test.java Ο µεταγλωττιστής παράγει το αρχείο: TEI\Test.class αλλά και τα TEI\ Informatics.class TEI\ Nursing.class TEI\ Marketing.class C:\Documents and Settings\Media Pc\JavaPack > java TEI.Test Ο διερµηνέας της java (Java Virtual Machine - JVM) εκτελεί τον bytecode κώδικα. ( εν απαιτείται να εκτελέσω javac για όλα τα αρχεία ) public class Marketing return ( "Marketing:'Tmima Marketing' " ); // TEI\Marketing.java 3. Εσωτερικά Πακέτα Τροποποιήστε ώστε να υπάρχουν µέσα στο πακέτο ΤΕΙ, τρία υπο-πακέτα STEF, SEYP, SDO και οι τρεις τάξεις Informatics, Nursing και Marketing να βρίσκονται στο αντίστοιχο υπο-πακέτο... Τι χρειάζεται Test.java Marketing.java Nursing.java Informatics.java Στο αρχείο Test.java θα µπεί import ΤΕΙ.STEF.Informatics; Στο αρχείο STEF\Informatics.java θα µπεί package ΤΕΙ.STEF; [6]
Tι σηµαίνει το public class για τις κλάσεις: Jar αρχεία Ένα ή περισσότερα πακέτα µπορούν να οµαδοποιηθούν σε αρχεία.jar π.χ. jar -cvf TEST.jar TEST Η αποσυµπίεση ενός.jar αρχείου γίνεται ως εξής: jar xvf TEST.jar [7]