Κατέβασμα παρουσίασης
Η παρουσίαση φορτώνεται. Παρακαλείστε να περιμένετε
1
Ειδικά Θέματα στον Προγραμματισμό Υπολογιστών
Είσοδος – Έξοδος – Μορφοποιήσεις - Εξαιρέσεις στη Java Βελώνης Γεώργιος – Καθηγητής Πληροφορικής ΠΕ20 Σχολ. Έτος
2
Περιεχόμενα Εισαγωγή Byte και Character streams
Προκαθορισμένα Ρεύματα (Standard Streams) Είσοδος δεδομένων από το πληκτρολόγιο με τη χρήση ορισμάτων Είσοδος δεδομένων από το πληκτρολόγιο με τη χρήση της κλάσης ”Scanner” Είσοδος δεδομένων από το πληκτρολόγιο με τη χρήση της κλάσης ”BufferedReader ” Βασική είσοδος δεδομένων από το πληκτρολόγιο με τη χρήση της μεθόδου ”read()” Βασική έξοδος χαρακτήρων στην οθόνη με τη χρήση της μεθόδου ”write()”
3
Περιεχόμενα Βασική έξοδος συμβολοσειρών στην οθόνη με τη χρήση των μεθόδων ”print()” & ”println()” Έξοδος δεδομένων στην οθόνη με τη χρήση της κλάσης ”PrintWriter” Μορφοποίηση εξόδου με τις μεθόδους ”printf()” και ”format()” Μορφοποίηση δεδομένων - Κλάση ”DecimalFormat” Έξοδος – Έξοδος με χρήση παραθύρων (Java Option Panes) Εξαιρέσεις (Exceptions)
4
Εισαγωγή Οι εργασίες εισόδου/εξόδου στη Java γίνονται μέσα από ρεύματα ή αλλιώς δέσμες συνεχούς ροής, γνωστά και ως streams, που συνδέονται με τις φυσικές μονάδες εισόδου/εξόδου του υπολογιστή. Ένα stream είναι ένα αντικείμενο, το οποίο επιτρέπει τη ροή δεδομένων μεταξύ ενός προγράμματος και κάποιας συσκευής εισόδου/εξόδου ή αρχείου. Η Java χειρίζεται τα streams μέσα από κλάσεις και μεθόδους του πακέτου java.io. Σε αυτό το πακέτο περιέχονται σχεδόν όλες οι κλάσεις, που θα χρειαστεί ο χρήστης, για να εκτελέσει είσοδο (ρεύμα εισόδου - input stream) και έξοδο (ρεύμα εξόδου - output stream) δεδομένων σε ένα πρόγραμμα Java. Όλα αυτά τα streams αποτελούν μια πηγή εισόδου και ένα προορισμό εξόδου. Το stream στο πακέτο java.io υποστηρίζει πολλούς τύπους δεδομένων, όπως τους βασικούς, τα αντικείμενα, τους χαρακτήρες κ.λπ.
5
Byte και Character streams
H Java ορίζει δύο τύπους δέσμης συνεχούς ροής: το byte και το character stream. Οι δέσμες byte streams χειρίζονται τις εισόδους και εξόδους των bytes. Τέτοιες εισόδους και εξόδους έχουμε για παράδειγμα, όταν διαβάζουμε ή γράφουμε δυαδικά δεδομένα από και προς τα αρχεία. Οι δέσμες character streams χειρίζονται εισόδους και εξόδους χαρακτήρων. Χρησιμοποιούν τη δέσμη χαρακτήρων Unicode και για το λόγο αυτό εφαρμόζονται σε διεθνείς εφαρμογές. Οι δέσμες αυτές είναι και πιο αποτελεσματικές απ’ ότι οι δέσμες byte. Οι δέσμες character προστέθηκαν στη Java με την έκδοση 1.1. Πάντως, οι χαμηλού επιπέδου επεξεργασίες εισόδου/εξόδου, εξακολουθούν να γίνονται με τις δέσμες byte.
6
Byte και Character streams
byte streams: Η Java ορίζει για το byte stream δύο ιεραρχικές κλάσεις, τις InputStream και OutputStream. Κάτω από αυτές τις κλάσεις υπάρχουν πολλές υποκλάσεις, που χειρίζονται τις διαφορετικές συσκευές εισόδου και εξόδου. Μέσα στις δύο αυτές κύριες κλάσεις, μπορούμε να ορίσουμε πολλές μεθόδους για την επεξεργασία των bytes, αλλά οι δύο κυριότερες από αυτές είναι οι read( ) και η write( ) (για το διάβασμα και γράψιμο των bytes). character streams: Η Java ορίζει για το character stream δύο ιεραρχικές κλάσεις, τις Reader και Writer. Οι δύο αυτές κλάσεις, χειρίζονται τη δέσμη Unicode, που επιτρέπει τη διεθνοποίηση των μηνυμάτων των εφαρμογών μας. Μέσα στις δύο αυτές κύριες κλάσεις, μπορούμε να ορίσουμε πολλές μεθόδους για την επεξεργασία των χαρακτήρων. Οι δύο κυριότερες είναι οι read( ) και write( ), για το διάβασμα για το γράψιμο των χαρακτήρων αντίστοιχα.
7
Byte και Character streams
8
Προκαθορισμένα Ρεύματα (Standard Streams)
Όλες οι γλώσσες προγραμματισμού παρέχουν υποστήριξη για το πρότυπο I/O, όπου ο χρήστης του προγράμματος μπορεί να πάρει είσοδο από το πληκτρολόγιο και στη συνέχεια, παράγει την έξοδο στην οθόνη του υπολογιστή. H Java παρέχει τα ακόλουθα προκαθορισμένα ρεύματα: Standard Input: Χρησιμοποιείται για να τροφοδοτήσει με δεδομένα το πρόγραμμα του χρήστη. Συνήθως το πληκτρολόγιο του υπολογιστή χρησιμοποιείται ως προκαθορισμένη συσκευή εισόδου και αντιπροσωπεύεται από το System.in. Standard Output: Χρησιμοποιείται για την εξαγωγή των δεδομένων που παράγονται από το πρόγραμμα του χρήστη. Συνήθως η οθόνη του υπολογιστή χρησιμοποιείται ως προκαθορισμένη συσκευή εξόδου και αντιπροσωπεύεται από το System.out.
9
Προκαθορισμένα Ρεύματα (Standard Streams)
Standard Error: Χρησιμοποιείται για να εξάγει τα σφάλματα των δεδομένων που παράγονται από το πρόγραμμα του χρήστη. Συνήθως η οθόνη του υπολογιστή χρησιμοποιείται ως προκαθορισμένη συσκευή εξόδου και αντιπροσωπεύεται από το System.err.
10
Είσοδος δεδομένων από το πληκτρολόγιο με τη χρήση ορισμάτων
Για να εισάγουμε δεδομένα από το πληκτρολόγιο κατά τη διάρκεια της εκτέλεσης του προγράμματος, προσθέτουμε ορίσματα στην εντολή του διερμηνευτή Java όνομα_προγράμματος. Σύνταξη: java όνομα_προγράμματος όρισμα1 όρισμα2 …. Η Java αποθηκεύει αυτές τις τιμές στις θέσεις του πίνακα με όνομα args (παράμετρος του main). Το όρισμα1 αποθηκεύεται στη θέση args[0], το όρισμα2 στη θέση args[1], κ.λπ. Παράδειγμα: java mesos_oros
11
Είσοδος δεδομένων από το πληκτρολόγιο με τη χρήση ορισμάτων
Παράδειγμα: public class average_course_term{ public static void main(String args[ ]) { float a,b,e,average; System.out.print("A quarter:\t"+args[0]); System.out.print("\nB quarter:\t"+args[1]); System.out.print("\nExaminations:\t"+args[2]); a=Float.valueOf(args[0]); b=Float.valueOf(args[1]); e=Float.valueOf(args[2]); average=((a+b)/2+e)/2; System.out.println("\nAverage:\t" + average); }
12
Είσοδος δεδομένων από το πληκτρολόγιο με τη χρήση της κλάσης ”Scanner”
Εισαγωγή στο πρόγραμμα της «βιβλιοθήκης» util, με την εντολή: import java.util.Scanner στην αρχή της κλάσης, πριν την επικεφαλίδα της. Δημιουργία αντικειμένου της κλάσης Scanner: Scanner input = new Scanner(System.in); (το αντικείμενο ονομάστηκε input, αλλά θα μπορούσε να έχει οποιοδήποτε άλλη ονομασία, π.χ. in, read, κ.λπ.) Κλήση της κατάλληλης μεθόδου της Scanner, ορισμένες από τις οποίες θα δούμε στις επόμενες διαφάνειες, π.χ.: int a = input.nextInt( ); double b = input.nextDouble( ); String c = input.nextLine( );
13
Είσοδος δεδομένων από το πληκτρολόγιο με τη χρήση της κλάσης ”Scanner”
Μέθοδος Επιστρέφει byte nextByte() short nextShort() int nextInt() long nextLong() Επιστρέφει την επόμενη λεκτική μονάδα (token) ως έναν ακέραιο αριθμό τύπου byte, short, int ή long αντίστοιχα. Αν η επόμενη λεκτική μονάδα δεν είναι έγκυρος ακέραιος, προκαλείται εξαίρεση τύπου InputMismatchException. float nextFloat() double nextDouble() Επιστρέφει την επόμενη λεκτική μονάδα ως έναν αριθμό κινητής υποδιαστολής float ή double αντίστοιχα. Αν η επόμενη λεκτική μονάδα δεν είναι έγκυρος αριθμός κινητής υποδιαστολής, προκαλείται εξαίρεση τύπου InputMismatchException.
14
Είσοδος δεδομένων από το πληκτρολόγιο με τη χρήση της κλάσης ”Scanner”
Μέθοδος Επιστρέφει String next() Βρίσκει και επιστρέφει την επόμενη λεκτική μονάδα από αυτό το σαρωτή ως ένα string. Μία λεκτική μονάδα συνήθως τελειώνει με whitespaces, όπως ένα κενό ή αλλαγή γραμμής. Εάν δεν υπάρχει λεκτική μονάδα, προκαλείται εξαίρεση τύπου NoSuchElementException ή IllegalStateException, αν ο ανιχνευτής (scanner) είναι κλειστός.
15
Είσοδος δεδομένων από το πληκτρολόγιο με τη χρήση της κλάσης ”Scanner”
Μέθοδος Επιστρέφει String nextLine() Επιστρέφει το υπόλοιπο της τρέχουσας γραμμής, εκτός από οποιονδήποτε διαχωριστή γραμμής που υπάρχει στο τέλος της. Εάν δε βρεθεί γραμμή, προκαλείται εξαίρεση τύπου NoSuchElementException ή IllegalStateException, αν ο ανιχνευτής (scanner) είναι κλειστός. Χρησιμοποιείται όταν το αλφαριθμητικό που εισάγεται έχει περισσότερα από ένα στοιχεία χωρισμένα μεταξύ τους με κενά (π.χ. μια φράση). void close() Κλείνει τη Scanner Σημείωση: Το void σημαίνει ότι δεν επιστρέφει καμία τιμή.
16
Είσοδος δεδομένων από το πληκτρολόγιο με τη χρήση της κλάσης ”Scanner”
Παράδειγμα: import java.util.Scanner; public class human_age{ public static void main(String args[]) { Scanner read = new Scanner(System.in); System.out.print("Enter your name:\t"); String name = read.nextLine(); System.out.print("Enter current year:\t"); int cy = read.nextInt(); System.out.print("Enter your birth year:\t"); int by = read.nextInt(); int age = cy - by; System.out.println("\nHi "+name+"! Your age is:\t" + age); read.close(); // Close Scanner }
17
Είσοδος δεδομένων από το πληκτρολόγιο με τη χρήση της κλάσης ”BufferedReader”
Εισαγωγή στο πρόγραμμα της «βιβλιοθήκης» io, με την εντολή: import java.io. BufferedReader; στην αρχή της κλάσης, πριν την επικεφαλίδα της. Ο ορισμός του buffer αυτού με την εντολή: BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); (Το αντικείμενο ονομάστηκε br, αλλά θα μπορούσε να έχει οποιοδήποτε άλλη ονομασία. Πρώτα γίνεται κλήση της υποκλάσης InputStreamReader, που μετατρέπει τα bytes σε χαρακτήρες. Για να επιτευχθεί αυτή η μετατροπή πρέπει να διασυνδεθεί η δέσμη με την System.in). Κλήση κατάλληλης μεθόδου της BufferedReader, π.χ.: int a = br.read( ); char c = (char)br.read( );
18
Είσοδος δεδομένων από το πληκτρολόγιο με τη χρήση της κλάσης ”BufferedReader”
Μέθοδος Επιστρέφει void close() Η μέθοδος αυτή κλείνει το ρεύμα και απελευθερώνει οποιουσδήποτε πόρους του συστήματος συνδέονται με αυτό. void mark(int readAheadLimit) Η μέθοδος αυτή σηματοδοτεί την παρούσα θέση στο ρεύμα. boolean markSupported() Αυτή η μέθοδος λέει αν αυτό το ρεύμα υποστηρίζει τη λειτουργία mark(), η οποία το κάνει. int read() Η μέθοδος αυτή διαβάζει ένα μοναδικό χαρακτήρα και τον μετατρέπεται σε int.
19
Είσοδος δεδομένων από το πληκτρολόγιο με τη χρήση της κλάσης ”BufferedReader”
Μέθοδος Επιστρέφει int read(char[ ] cbuf, int off, int len) Αυτή η μέθοδος διαβάζει χαρακτήρες σε ένα τμήμα ενός πίνακα. char[ ] cbuf: Πίνακας χαρακτήρων που λειτουργεί ως buffer. int off(set): Αυτή η παράμετρος θα καθορίσει από πού να αρχίσει στον πίνακα χαρακτήρων του buffer. int len(gth): Το μήκος από τους χαρακτήρες που θα πρέπει να διαβάσει από το ρεύμα χαρακτήρων. String readLine() Αυτή η μέθοδος διαβάζει μια γραμμή κειμένου.
20
Είσοδος δεδομένων από το πληκτρολόγιο με τη χρήση της κλάσης ”BufferedReader”
Μέθοδος Επιστρέφει boolean ready() Αυτή η μέθοδος λέει αν αυτό το ρεύμα είναι έτοιμο να διαβαστεί. Επιστρέφει true αν η επόμενη read() είναι εγγυημένο ότι δεν θα εμποδίσει την είσοδο, διαφορετικά false. Σημειώστε ότι η επιστροφή false, δεν εγγυάται ότι η επόμενη ανάγνωση θα μπλοκαριστεί. void reset() Αυτή η μέθοδος επαναφέρει το ρεύμα στην πιο πρόσφατη ένδειξη. Σημειώστε ότι αν δεν έγινε κλήση της μεθόδου mark(), πριν από την κλήση της μεθόδου reset(), τότε θα συμβεί IOException. long skip(long n) Η μέθοδος αυτή παραλείπει χαρακτήρες.
21
Είσοδος δεδομένων από το πληκτρολόγιο με τη χρήση της κλάσης ”BufferedReader”
Προσοχή: Μπορούμε να χρησιμοποιήσουμε: τη δήλωση import java.io.*; που εισάγει όλες τις κλάσεις και μεθόδους του πακέτου io. τη σύνταξη throws IOException μετά τη main( ), που πρέπει να συντάσσεται πάντα, όταν χειριζόμαστε είσοδο/έξοδο από το πληκτρολόγιο. Όλες οι περιπτώσεις της μεθόδου read( ) είναι τύπου throws IOException. Δηλαδή: int read() throws IOException int read(char[ ] cbuf, int off, int len) throws IOException
22
Είσοδος δεδομένων από το πληκτρολόγιο με τη χρήση της κλάσης ”BufferedReader”
23
Είσοδος δεδομένων από το πληκτρολόγιο με τη χρήση της κλάσης ”BufferedReader”
Παράδειγμα: import java.io.*; public class ReadAChar1 { public static void main(String args[]) throws IOException { BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); System.out.print("Enter a character:"); char c = (char) br.read(); System.out.println(" \nYou entered: " + c); br.close(); }
24
Είσοδος δεδομένων από το πληκτρολόγιο με τη χρήση της κλάσης ”BufferedReader”
Παράδειγμα: import java.io.*; public class ReadAString1a { public static void main(String args[]) throws IOException { BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); System.out.print("Enter a number: "); String s = br.readLine(); int a=Integer.parseInt(s); System.out.println("Your number is: " + a); br.close(); }
25
Είσοδος δεδομένων από το πληκτρολόγιο με τη χρήση της κλάσης ”BufferedReader”
Παράδειγμα: import java.io.*; public class ReadAString1b { public static void main(String args[]) throws IOException { BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); System.out.print("Enter a number: "); int a=Integer.parseInt(br.readLine()); System.out.println("Your number is: " + a); br.close(); }
26
Είσοδος δεδομένων από το πληκτρολόγιο με τη χρήση της κλάσης ”BufferedReader”
Παράδειγμα: import java.io.*; public class ReadAString2 { public static void main(String args[]) throws IOException { BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); System.out.print("Enter a string:"); String s = br.readLine(); System.out.println("Your string is: " + s); }
27
Βασική είσοδος δεδομένων από το πληκτρολόγιο με τη χρήση της μεθόδου ”read()”
Η μέθοδος read( ), ορίζεται από την κλάση InputStream της System.in, που κάνει είσοδο της μορφής byte stream. Η μέθοδος αυτή επιστρέφει το επόμενο byte των δεδομένων (ένα μη προσημασμένο ακέραιο από 0 έως 255), ή -1 αν έχει φτάσει στο τέλος του ρεύματος. Για να εισάγουμε ένα string με τη χρήση αυτής της μεθόδου, θα πρέπει να γίνει χρήση εντολών επανάληψης, που θα δούμε σε επόμενο κεφάλαιο. Η απλή της μορφή είναι: System.in.read(); //Είσοδος ενός byte System.in.read(byte b[]); //Είσοδος ενός αριθμού bytes σε πίνακα Σημείωση: Όπως προαναφέρθηκε, για τη χρήση της μεθόδου read( ), είναι απαραίτητη η σύνταξη throws IOException, μετά τη δήλωση main( ).
28
Βασική είσοδος δεδομένων από το πληκτρολόγιο με τη χρήση της μεθόδου ”read()”
Παράδειγμα: import java.io.*; public class ReadAChar2{ public static void main(String args[ ]) throws IOException { System.out.print("Enter a character: "); char c=(char)System.in.read(); System.out.println("Entered the character \""+c+"\""); }
29
Βασική είσοδος δεδομένων από το πληκτρολόγιο με τη χρήση της μεθόδου ”read()”
Παράδειγμα: import java.io.*; public class ReadAString3{ public static void main(String args[ ]) throws IOException { String s=""; char c; System.out.print("Enter a text: "); while((c=(char)System.in.read())!='\n'){s+=c;} System.out.println("Your text is: " + s); }
30
Βασική έξοδος χαρακτήρων στην οθόνη με τη χρήση της μεθόδου”write()”
Η μέθοδος write( ), ορίζεται από την κλάση PrintStream της System.out, που κάνει έξοδο της μορφής byte stream. Για να εμφανίσετε ένα string με τη χρήση αυτής της μεθόδου, θα πρέπει να γίνει χρήση εντολών επανάληψης, που θα δούμε σε επόμενο κεφάλαιο. Η απλή της μορφή είναι: System.out.write(int x); //Έξοδος ενός byte System.out.write(byte b[]); //Έξοδος ενός αριθμού bytes από πίνακα Σημείωση: Για τη χρήση της μεθόδου write( ), είναι απαραίτητη η σύνταξη throws IOException, μετά τη δήλωση main( ).
31
Βασική έξοδος χαρακτήρων στην οθόνη με τη χρήση της μεθόδου”write()”
Παράδειγμα: import java.io.*; public class WriteAChar { public static void main(String args[]) throws IOException { BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); System.out.print("Enter a character:"); char c = (char) br.read(); System.out.print(" \nYou entered: "); System.out.write(c); System.out.write('\n'); }
32
Βασική έξοδος χαρακτήρων στην οθόνη με τη χρήση της μεθόδου”write()”
Παράδειγμα: import java.io.*; public class WriteAString4{ public static void main(String args[]) throws IOException { String s=""; char c; // Read a text System.out.print("Enter a text: "); while((c=(char)System.in.read())!='\n'){ s+=c; }
33
Βασική έξοδος χαρακτήρων στην οθόνη με τη χρήση της μεθόδου”write()”
Παράδειγμα συνέχεια: // Write a text System.out.print("Your text is: "); for(int i = 0; i < s.length(); i++) { System.out.write(s.charAt(i)); } System.out.write('\n');
34
Βασική έξοδος συμβολοσειρών στην οθόνη με τη χρήση των μεθόδων ”print()” & ”println()”
Οι μέθοδοι print( ) και println( ) που έχουμε ήδη χρησιμοποιήσει, ορίζονται από την κλάση PrintStream της System.out, η οποία κάνει έξοδο της μορφής byte stream. Η μόνη διαφορά μεταξύ των δύο μεθόδων είναι ότι μετά την εκτέλεση της println( ), ο δρομέας πηγαίνει στην αρχή της επόμενης γραμμής, ενώ με τη χρήση της print( ), ο δρομέας παραμένει στην ίδια γραμμή, στο τέλος των στοιχείων που εμφάνισε στην οθόνη. Η απλή τους μορφή είναι: System.out.println(String s); // Έξοδος string Σημείωση: Για τη χρήση των μεθόδων print( ) και println( ), δεν είναι απαραίτητη η σύνταξη throws IOException, μετά τη δήλωση main( ).
35
Έξοδος δεδομένων στην οθόνη με τη χρήση της κλάσης ”PrintWriter”
Εκτός από την εμφάνιση αποτελεσμάτων στην οθόνη, με την System.out μπορούμε να εμφανίσουμε κείμενα και αποτελέσματα χρησιμοποιώντας την κλάση PrintWriter. H PrintWriter χρησιμοποιείται περισσότερο στις πραγματικές εφαρμογές απ’ ότι η System.out και υποστηρίζει τις μεθόδους print( ) και println( ) για έξοδο όλων των τύπων, ακόμη και αντικειμένων (με την κλήση της μεθόδου toString( )). Για να γράψουμε στην οθόνη χρησιμοποιώντας την PrintWriter, ορίζουμε πρώτα τη System.out για τη δέσμη εξόδου. Η PrintWriter θα οδηγήσει τη δέσμη στην οθόνη, μετά από κάθε νέα γραμμή.
36
Έξοδος δεδομένων στην οθόνη με τη χρήση της κλάσης ”PrintWriter”
PrintWriter(OutputStream outputstream, Boolean emptyTheOutputStream) όπου ορίζουμε το stream εξόδου και την τιμή true (ή false) αν θέλουμε να αδειάζει το stream, όταν τελειώνει η εμφάνιση στην κονσόλα. Για παράδειγμα: PrintWriter pw = new PrintWriter(System.out, true); Δηλαδή ορίζουμε ένα αντικείμενο της PrintWriter, που προσδιορίζει τη System.out σαν stream εξόδου και την τιμή true για το άδειασμα του stream, μετά την εμφάνιση των αποτελεσμάτων.
37
Έξοδος δεδομένων στην οθόνη με τη χρήση της κλάσης ”PrintWriter”
Παράδειγμα: import java.io.*; public class ReadAChar3{ public static void main(String args[ ]) throws IOException { PrintWriter pw = new PrintWriter(System.out, true); System.out.print("Enter a character: "); char c=(char)System.in.read(); pw.println("Entered the character \""+c+"\""); }
38
Μορφοποίηση εξόδου με τις μεθόδους ”printf()” και ”format()”
Η κλάση PrintWriter, προσφέρει επίσης τις μεθόδους format( ) και printf( ), οι οποίες είναι παρόμοιες με την print( ) και μπορούν να αναπαραστήσουν την έξοδο με συγκεκριμένο τρόπο (format). Όπως και στην print( ), η εμφάνιση γίνεται στην τρέχουσα γραμμή. Η System.out.printf και η System.out.format μπορεί να περιέχουν οποιοδήποτε αριθμό ορισμάτων. Το πρώτο όρισμα είναι πάντοτε ένα αλφαριθμητικό μορφοποίησης (format string), που εμπεριέχει έναν ή περισσότερους προσδιοριστές μορφοποίησης (format specifiers) για τα υπόλοιπα ορίσματα. Τα υπόλοιπα ορί-σματα (εκτός από το πρώτο) είναι τιμές που θα εμφανιστούν στην οθόνη. Η μορφή της printf ( )(ομοίως και της format( )) είναι: System.out.printf( "format-string" [,όρισμα1, όρισμα2, … ]); (οι αγκύλες υποδηλώνουν προαιρετικές παραμέτρους)
39
Μορφοποίηση εξόδου με τις μεθόδους ”printf()” και ”format()”
Αλφαριθμητικό μορφοποίησης (format string) Αποτελείται από λεκτικές σταθερές (literals) και προσδιοριστές μορφοποίησης (format specifiers). Τα ορίσματα απαιτούνται, μόνο εάν υπάρχουν προσδιοριστές μορφοποίησης του αλφαριθμητικού μορφοποίησης (format string). Οι προσδιοριστές μορφοποίησης περιλαμβάνουν: σημαίες (flags), πλάτος (width), ακρίβεια (precision) και μετατροπή χαρακτήρων (conversion character), με την ακόλουθη σειρά: % [flags] [width] [.precision] conversion-character (οι αγκύλες υποδηλώνουν προαιρετικές παραμέτρους)
40
Μορφοποίηση εξόδου με τις μεθόδους ”printf()” και ”format()”
Σημαίες (Flags): - : αριστερή στοίχιση (η προεπιλογή είναι να γίνει δεξιά στοίχιση) + : έξοδος ένα συν (+) ή μείον (-) πρόσημο για μία αριθμητική τιμή 0 : γεμίζει αριθμητικές τιμές με μηδενικά (η προεπιλογή είναι συμπλήρωση με κενά) , : κόμμα (τελεία για Ελληνικές ρυθμίσεις) ως διαχωριστής ομαδοποίησης (για αριθμούς >= 1000) : το κενό θα εμφανίσει αρνητικό πρόσημο εάν ο αριθμός είναι αρνητικός ή ένα κενό αν είναι θετικός
41
Μορφοποίηση εξόδου με τις μεθόδους ”printf()” και ”format()”
Πλάτος (Width): Καθορίζει το πλάτος του πεδίου για την έξοδο του ορίσματος και αντιπροσωπεύει τον ελάχιστο αριθμό χαρακτήρων, που πρέπει να γραφτεί στην έξοδο. Περιλαμβάνει, το χώρο για τους αναμενόμενους διαχωριστές ομαδοποίησης και την υποδιαστολή, για τον προσδιορισμό του πλάτους στις αριθμητικές τιμές. Ακρίβεια (Precision): Χρησιμοποιείται για να περιορίσει την έξοδο, ανάλογα με τη μετατροπή. Καθορίζει τον αριθμό των ψηφίων της ακρίβειας, όταν έχει έξοδο τιμές κινητής υποδιαστολής, ή το μήκος ενός substring που εξάγεται από ένα string. Οι αριθμοί στρογγυλοποιούνται στην καθορισμένη ακρίβεια.
42
Μορφοποίηση εξόδου με τις μεθόδους ”printf()” και ”format()”
Χαρακτήρες Μετατροπής (Conversion-Characters): d : Δεκαδικός ακέραιος [byte, short, int, long] f : Αριθμός κινητής υποδιαστολής [float, double] c : Χαρακτήρας – Το κεφαλαίο %C θα κάνει κεφαλαίο το γράμμα s : String - Το κεφαλαίο %S θα κάνει κεφαλαία όλα τα γράμματα του string e : Εμφανίζει (όπως και το %E) έναν αριθμό κινητής υποδιαστολής σε εκθετική μορφή b : Εμφανίζει (όπως και το %B) λογικές τιμές (Boolean values) % : Εμφανίζει ένα % σύμβολο
43
Μορφοποίηση εξόδου με τις μεθόδους ”printf()” και ”format()”
Χαρακτήρες Μετατροπής (Conversion-Characters): h : Εμφανίζει (όπως και το %H) τη 16ξαδική μορφή ενός αριθμού o : Εμφανίζει την 8δική μορφή ενός αριθμού n : Νέα γραμμή – Η πλατφόρμα καθορίζει τη χρήση του %n αντί του \n, για μεγαλύτερη συμβατότητα
44
Μορφοποίηση εξόδου με τις μεθόδους ”printf()” και ”format()”
Στους αριθμούς κινητής υποδιαστολής, οι συντελεστές μορφοποίησης έχουν την παρακάτω μορφή: "% <αριθμός ψηφίων>.<πλήθος δεκαδικών ψηφίων>f" Για παράδειγμα, ο "%10.2f" και ο "%.2f " είναι δύο προσδιοριστές που χρησιμοποιούνται για την απεικόνιση των αριθμών με δεκαδικά ψηφία. Ο προσδιοριστής "%n.mf" σημαίνει: έναρξη του προσδιοριστή με το σύμβολο % εμφάνισε το πολύ n χαρακτήρες, δεξιά στοιχισμένους (αν χρειαστεί γέμισε με κενά διαστήματα από αριστερά) εμφάνισε m ψηφία μετά την υποδιαστολή (.2) και τερμάτισε την εμφάνιση του αριθμού τύπου float
45
Μορφοποίηση εξόδου με τις μεθόδους ”printf()” και ”format()”
X . n-(m+1)=7 1 m=2 n=10 Στο δεύτερο παράδειγμα, ο προσδιοριστής "%.2f" σημαίνει ότι θα εμφανιστούν 2 δεκαδικά ψηφία μετά την υποδιαστολή και θα χρησιμοποιηθεί το μικρότερο δυνατό εύρος ψηφίων. Όταν ο προσδιοριστής n δεν επαρκεί για την εμφάνιση των χαρακτήρων, τότε η μορφοποίηση αγνοείται και το στοιχείο εμφανίζεται, όπως θα εμφανιζόταν μη μορφοποιημένο. Για τον προσδιοριστή m, ισχύει στρογγυλοποίηση στον πλησιέστερο ακέραιο.
46
Μορφοποίηση εξόδου με τις μεθόδους ”printf()” και ”format()”
Εντολή Αποτέλεσμα printf("'%.1f'", ); '15,3' printf("'%.2f'", ); '15,35' printf("'%8.2f'", ); '˽˽˽15,35' printf("'%8.4f'", ); '˽15,3458' printf("'%08.2f'", ); '00015,35' printf("'%-8.2f'", ); '15,35˽˽˽' printf("'%-8.2f'", ); ' ,35'
47
Μορφοποίηση εξόδου με τις μεθόδους ”printf()” και ”format()”
Εντολή Αποτέλεσμα printf("'%3d'", 0); '˽˽0' printf("'%3d'", ); ' ' printf("'%3d'", -15); '-15' printf("'%3d'", ); ' ' printf("'%-3d'", 0); '0˽˽' printf("'%-3d'", ); printf("'%-3d'", -15); printf("'%-3d'", );
48
Μορφοποίηση εξόδου με τις μεθόδους ”printf()” και ”format()”
Εντολή Αποτέλεσμα printf("'%03d'", 0); '000' printf("'%03d'", 5); '005' printf("'%03d'", ); ' ' printf("'%03d'", -15); '-15' printf("'%03d'", ); ' ' printf("'%5d'", 15); '˽˽˽15' printf("'%-5d'", 15); '15˽˽˽' printf("'%05d'", 15); '00015' printf("'%+5d'", 15); '˽˽+15' printf("'%-+5d'", 15); '+15˽˽'
49
Μορφοποίηση εξόδου με τις μεθόδους ”printf()” και ”format()”
Εντολή Αποτέλεσμα printf("'%10.3e'", ); '˽1,535e+03' printf("'%010.2E'", ); '001,53E+03' printf("'%,10d'", ); ' ' printf("'%,13d'", ); '˽˽ ' printf("'%,10.2f'", ); ' ,79' printf("'%6.2f%%'", 0.45); '˽˽0,45%' printf("'%d'", 52); '52' printf("'%f'", 5.2); ' ' printf("'%h'",12) 'c' printf("'%3H'",12) '˽˽C'
50
Μορφοποίηση εξόδου με τις μεθόδους ”printf()” και ”format()”
Εντολή Αποτέλεσμα printf("'%3H'",31) '˽1F' printf("'%3ο'",31) '˽37' printf("'%c'", 'A'); 'A' printf("'%3c'", 'a'); '˽˽a' printf("'%3c'", 'A'); '˽˽A' printf("'%3C'", 'a'); printf("'%s'", "George"); 'George' printf("'%10s'", "George"); '˽˽˽˽George'
51
Μορφοποίηση εξόδου με τις μεθόδους ”printf()” και ”format()”
Εντολή Αποτέλεσμα printf("'%-10s'", "George"); 'George˽˽˽˽' printf("'%10S'", "George"); '˽˽˽˽GEORGE' printf("'%b'", 3>2); 'true' printf("'%B'", 3>2); 'TRUE' printf("'%b'", null); 'false' Οι δύο παρακάτω εντολές, έχουν ακριβώς το ίδιο αποτέλεσμα εμφάνισης στην οθόνη: System.out.println ("Hello "+str); System.out.printf ("Hello %s", str);
52
Μορφοποίηση εξόδου με τις μεθόδους ”printf()” και ”format()”
Παράδειγμα: import java.io.*; public class Revolution{ public static void main(String args[ ]){ int day = 25; String month = "March"; String country = "Hellas"; int year = 1821; System.out.printf("Revolution on %dth %s, %d%n%n", day,month,year); System.out.printf("Country:%10s%n", country); }
53
Μορφοποίηση εξόδου με τις μεθόδους ”printf()” και ”format()”
Παράδειγμα: import java.io.*; public class marks1{ public static void main(String args[ ]){ String name1="Nikos"; String name2="Giannoula"; float marks1=15; float marks2=9.0f; System.out.format("%-10s : %4.1f%n",name1,marks1); System.out.format("%-10s : %4.1f%n",name2,marks2); }
54
Μορφοποίηση εξόδου με τις μεθόδους ”printf()” και ”format()”
Η κλάση String, έχει τη format( ) ως ισοδύναμη μέθοδο κλάσης, που επιστρέφει ένα αντικείμενο String και όχι ένα αντικείμενο PrintStream. Χρησιμοποιώντας τη μέθοδο format( ), μας επιτρέπεται να δημιουργήσουμε μια μορφοποιημένη συμβολοσειρά, που μπορούμε να επαναχρησιμοποιήσουμε, σε αντίθεση με μια εφάπαξ δήλωση εκτύπωσης. String.format("%[argument number][flags][width] [.precision] type") Παράδειγμα: String str = String.format("Hello %s", "George"); System.out.println(str);
55
Μορφοποίηση εξόδου με τις μεθόδους ”printf()” και ”format()”
Παράδειγμα: import java.io.*; public class marks2{ public static void main(String args[ ]){ String name1="Nikos"; String name2="Giannoula"; float m1=15; float m2=9.0f; System.out.print(String.format("%-10s : %4.1f%n",name1,m1)); System.out.print(String.format("%-10s : %4.1f%n",name2,m2)); }
56
Μορφοποίηση δεδομένων Κλάση ”DecimalFormat”
Εισαγωγή στο πρόγραμμα της «βιβλιοθήκης» text, με την εντολή: import java.text.DecimalFormat; στην αρχή της κλάσης, πριν την επικεφαλίδα της. Δημιουργία αντικειμένου της κλάσης DecimalFormat: DecimalFormat df = new DecimalFormat("pattern"); (το αντικείμενο ονομάστηκε df, αλλά θα μπορούσε να έχει οποιοδήποτε άλλη ονομασία, ενώ ο προσδιοριστής (pattern) σχηματίζεται από τα προκαθορισμένα σύμβολα)
57
Μορφοποίηση δεδομένων Κλάση ”DecimalFormat”
df.format(number) Παράδειγμα: double d = 17.5; DecimalFormat df = new DecimalFormat ("###0.00"); String s = df.format (d); System.out.println (s); System.out.println (df.format(135.65);
58
Μορφοποίηση δεδομένων Κλάση ”DecimalFormat”
Σύμβολο Περιγραφή Ένα ψηφίο - εμφανίζεται πάντα, ακόμη και αν ο αριθμός έχει λιγότερα ψηφία (τότε εμφανίζεται 0). # Ένα ψηφίο, τα αρχικά μηδενικά παραλείπονται. . Διαχωριστικό δεκαδικών ψηφίων , Διαχωριστικό ομαδοποίηση ς (π.χ. διαχωριστικό χιλιάδων) E Σηματοδοτεί το διαχωρισμό της mantissa και του εκθέτη για εκθετική μορφή. ; Διαχωρίζει θετικές και αρνητικές μορφές. - Σηματοδοτεί το αρνητικό πρόθεμα (prefix) του αριθμού.
59
Μορφοποίηση δεδομένων Κλάση ”DecimalFormat”
Σύμβολο Περιγραφή % Πολλαπλασιάζει επί 100 και δείχνει τον αριθμό ως ποσοστό \u2030 Πολλαπλασιάζει με 1000 και δείχνει τον αριθμό ως ανά μίλι. ¤ ή\u00A4 Σύμβολο νομίσματος - αντικαθίσταται από το σύμβολο του νομίσματος σύμφωνα με την τοπική ρύθμιση του υπολογιστή. Επίσης κάνει χρήση μορφοποίησης η νομισματικού διαχωριστικού δεκαδικών αντί για κανονική υποδιαστολή. ¤¤ (\u00A4\u00A4) -μορφοποίηση που χρησιμοποιεί διεθνή νομισματικά σύμβολα.
60
Μορφοποίηση δεδομένων Κλάση ”DecimalFormat”
Σύμβολο Περιγραφή X Σηματοδοτεί ένα χαρακτήρα που πρόκειται να χρησιμοποιηθεί ως πρόθεμα (suffix) ή επίθεμα (prefix) ενός αριθμού. Για παράδειγμα "0000GR" για τιμή 2002 εμφανίζει τον αριθμό με επίθεμα "GR" (2002GR). ' Χρησιμοποιείται για να κάνουμε χρήση των ειδικών χαρακτήρων ως πρόθεμα ή επίθεμα ενός αριθμού. Για παράδειγμα, η "'#'##" μορφοποιεί το 15 σε "#15". Για να δημιουργήσουμε ένα μόνον εισαγωγικό, χρησιμοποιούμε δύο εισαγωγικά στη σειρά: "# o''clock".
61
Μορφοποίηση δεδομένων Κλάση ”DecimalFormat”
Pattern Number Formatted String ###.### 123,456 ###.# 123,5 ###,###.## ,79 000.### 9.95 009,95 ##0.### 0.95 0,95 $###,###.## $15.450,55 ###.##GRD 340.75 340,75GRD 0.0000E00 150.35 1,5035Ε02 ###.## \u00A4\u00A4 ή ###.## ¤¤ 340,75 EUR
62
Μορφοποίηση δεδομένων Κλάση ”DecimalFormat”
Pattern Number Formatted String -###.### -123,456 ##0.00% 0.5 50,00% 00.00;-00.00 15.5 15,50 -15.50 -15,50 00 o'' clock 15 15 o' clock '#'000 #015 000'#' 015# 000000\u2030 015000?
63
Μορφοποίηση δεδομένων Κλάση ”DecimalFormat”
Παράδειγμα: import java.text.*; public class currency{ public static void main(String args[ ]) { DecimalFormat df1 = new DecimalFormat("\u0024###.##"); double dollar=1.06; DecimalFormat df2 = new DecimalFormat("\u00a3###.##"); double pound=0.7; DecimalFormat df3 = new DecimalFormat("\u00a5###.##"); double yen=129.75; System.out.println("Euro exchange rate"); System.out.println(df1.format(dollar)); System.out.println(df2.format(pound)); System.out.println(df3.format(yen)); } Δεν εμφανίζονται σωστά
64
Είσοδος – Έξοδος με χρήση παραθύρων (Java Option Panes)
Μία άλλη χρήσιμη κλάση για την είσοδο των δεδομένων του προγράμματος καθώς και για την εμφάνιση των αποτελεσμάτων, είναι η JOptionPane. Αυτή βρίσκεται στη javax.swing βιβλιοθήκη και μας επιτρέπει να έχουμε παράθυρα εισόδου, όπως αυτό: Και παράθυρα μηνυμάτων όπως αυτό:
65
Είσοδος – Έξοδος με χρήση παραθύρων (Java Option Panes)
Το πρώτο πράγμα που πρέπει να κάνουμε είναι να δηλώσουμε στο πρόγραμμά μας, τη βιβλιοθήκη που θα θέλουμε να χρησιμοποιήσουμε: import javax.swing.JOptionPane; Αυτό λέει στη Java ότι θέλουμε να χρησιμοποιήσουμε τη JOptionPane κλάση, που βρίσκεται στη javax.swing βιβλιοθήκη. Είσοδος δεδομένων (showInputDialog) - Σύνταξη: μεταβλητή = JOptionPane.showInputDialog("Μήνυμα εισόδου" [," Κείμενο που θα εμφανίζεται μέσα στο πλαίσιο κειμένου"]) Εμφάνιση μηνύματος (showMessageDialog) - Σύνταξη: JOptionPane.showMessageDialog(null, μεταβλητές_σταθερές[, "Μήνυμα γραμμής τίτλου", JOptionPane.εικονίδιο_παραθύρου]) (οι αγκύλες υποδηλώνουν προαιρετικές παραμέτρους)
66
Είσοδος – Έξοδος με χρήση παραθύρων (Java Option Panes)
Βλέποντας τη σύνταξη του showMessageDialog , παρατηρούμε ότι μέσα στις παρενθέσεις θα πρέπει να μπει πρώτα η λέξη null. Αυτή είναι μία λέξη-κλειδί της Java και απλά σημαίνει ότι το πλαίσιο μηνύματος δεν σχετίζεται με κάτι άλλο στο πρόγραμμα. Μετά από το κόμμα ακολουθούν οι μεταβλητές και/ή οι σταθερές που θέλουμε να προβάλουμε και οι παράμετροι "Μήνυμα γραμμής τίτλου", JOptionPane.εικονίδιο_παραθύρου που πάνε μαζί και είναι προαιρετικοί. Επίσης το πρόγραμμα τελειώνει με τον κώδικα: System.exit(0); Όπως υποδηλώνει το όνομά του, αυτό εξασφαλίζει την έξοδο από το πρόγραμμα και «καθαρίζει» για μας, αφαιρώντας από τη μνήμη όλα τα αντικείμενα που έχουν δημιουργηθεί.
67
Είσοδος – Έξοδος με χρήση παραθύρων (Java Option Panes)
Η παράμετρος JOptionPane.εικονίδιο_παραθύρου του showMessageDialog παίρνει τις παρακάτω τιμές: JOptionPane.INFORMATION_MESSAGE JOptionPane.ERROR_MESSAGE JOptionPane.PLAIN_MESSAGE (κανένα εικονίδιο) JOptionPane.QUESTION_MESSAGE JOptionPane.WARNING_MESSAGE
68
Είσοδος – Έξοδος με χρήση παραθύρων (Java Option Panes)
Παράδειγμα: import javax.swing.JOptionPane; public class message{ public static void main(String args[ ]){ String name; name = JOptionPane.showInputDialog("Enter your name"); JOptionPane.showMessageDialog( null, "Hello "+name ); System.exit(0); }
69
Είσοδος – Έξοδος με χρήση παραθύρων (Java Option Panes)
Παράδειγμα: String name = JOptionPane.showInputDialog("Name","Enter your name"); Παράδειγμα: JOptionPane.showMessageDialog( null, "Hello "+name, "Output", JOptionPane.INFORMATION_MESSAGE);
70
Είσοδος – Έξοδος με χρήση παραθύρων (Java Option Panes)
Παράδειγμα: JOptionPane.showMessageDialog( null, "Hello "+name,"Message", JOptionPane. ERROR_MESSAGE); Παράδειγμα: JOptionPane.showMessageDialog( null, "Hello "+name,"Message", JOptionPane. PLAIN_MESSAGE);
71
Είσοδος – Έξοδος με χρήση παραθύρων (Java Option Panes)
Παράδειγμα: JOptionPane.showMessageDialog( null, "Hello "+name,"Message", JOptionPane. QUESTION_MESSAGE); Παράδειγμα: JOptionPane.showMessageDialog( null, "Hello "+name,"Message", JOptionPane. WARNING_MESSAGE);
72
Είσοδος – Έξοδος με χρήση παραθύρων (Java Option Panes)
Παράδειγμα: import javax.swing.JOptionPane; public class sum{ public static void main(String args[ ]){ int x = Integer.parseInt(JOptionPane.showInputDialog("Enter 1st integer")); int y = Integer.parseInt(JOptionPane.showInputDialog("Enter 2nd integer")); JOptionPane.showMessageDialog(null, "Sum: "+(x+y)); System.exit(0); }
73
Είσοδος – Έξοδος με χρήση παραθύρων (Java Option Panes)
74
Είσοδος – Έξοδος με χρήση παραθύρων (Java Option Panes)
Για την εξαγωγή μορφοποιημένων αποτελεσμάτων, μπορούμε να κάνουμε χρήση της μεθόδου format(), μέσω της κλάσης DecimalFormat καθώς και της String.. Παράδειγμα: DecimalFormat df = new DecimalFormat("00000"); ……… JOptionPane.showMessageDialog(null,"Sum: "+df.format(x+y)); ή JOptionPane.showMessageDialog(null, String.format("Sum: %05d",x+y));
75
Εξαιρέσεις (Exceptions)
Με τον όρο Εξαίρεση στον προγραμματισμό, αναφερόμαστε σε μία ένδειξη ότι κάτι συμβαίνει λάθος κατά την εκτέλεση ενός προγράμματος. Η Java διαθέτει μηχανισμούς διαχείρισης των εξαιρέσεων (Exception handling) που μπορεί να συμβούν κατά τη διάρκεια της εκτέλεσης ενός προγράμματος, έτσι ώστε να μπορέσει να συνεχίσει ή τουλάχιστο να τερματίσει την εκτέλεσή του με ελεγχόμενο τρόπο. Μία εξαίρεση περιέχει πληροφορίες για το τι έχει συμβεί και χάρη σε αυτούς τους μηχανισμούς μπορούν να φτιαχτούν πιο αξιόπιστα και πιο ανεκτικά σε σφάλματα προγράμματα.
76
Εξαιρέσεις (Exceptions)
Όταν ένα αναπάντεχο συμβάν προκύψει κατά την εκτέλεση ενός προγράμματος Java, π.χ. διαίρεση δια του μηδέν, το πρόγραμμα ρίχνει (throws) μία εξαίρεση και το σύστημα προσπαθεί να βρει τον κατάλληλο διαχειριστή εξαιρέσεων για να το διαχειριστεί. Ένας διαχειριστής εξαιρέσεων (exception handler) μπορεί να πιάσει (catch), δηλαδή να αναλάβει να διαχειριστεί κάποια εξαίρεση, βάσει του τύπου της και του τύπου που ορίζεται στη δήλωση του catch. Αν η Java δε βρει τον κατάλληλο διαχειριστή εξαιρέσεων για να το διαχειριστεί, χρησιμοποιείται ο προκαθορισμένος διαχειριστής εξαιρέσεων (default exception handler), ο οποίος εμφανίζει κάποιες πληροφορίες και ακολούθως τερματίζεται η εκτέλεση του προγράμματος.
77
Εξαιρέσεις (Exceptions)
Στη Java, μία εξαίρεση είναι αντικείμενο της κλάσης Throwable ή κάποιας υποκλάσης της. Οι κλάσεις που παράγονται από την Error χρησιμοποιούνται για σημαντικά λάθη του συστήματος, όπως για παράδειγμα το λάθος OutOfMemoryError (από τα οποία συνήθως δε μπορούμε να ανακάμψουμε), ενώ οι κλάσεις που παράγονται από την Exception και την RuntimeException (π.χ. το ArithmeticException), χρησιμοποιούνται για συνηθισμένα λάθη, τα οποία το πρόγραμμα μπορεί να θέλει να «πιάσει» και να ανακάμψει από αυτά.
78
Εξαιρέσεις (Exceptions)
79
Εξαιρέσεις (Exceptions)
Κάποιες γνωστές Run time exceptions είναι οι ακόλουθες: ArithmeticException: παράδειγμα η διαίρεση µε το 0. ArrayIndexOutOfBoundsException: πρόσβαση σε στοιχείο πίνακα σε θέση που δεν υπάρχει. ArrayStoreException: προσπάθεια αποθήκευσης λάθους τύπου δεδομένων στοιχείο σε πίνακα. StringIndexOutOfBoundsException: για παράδειγμα αναφορά σε σύμβολο στην 10η θέση μιας συμβολοσειράς µε 8 θέσεις. NullPointerException: η εφαρμογή προσπαθεί να χρησιμοποιήσει ένα αντικείμενο που είναι null. ClassCastException: λανθασμένο casting.
80
Εξαιρέσεις (Exceptions)
Standard Java exception classes
81
Εξαιρέσεις (Exceptions)
Κάποιες γνωστές Error exceptions είναι οι ακόλουθες: InternalError: σηματοδοτήσει ένα εσωτερικό σφάλμα της εικονικής μηχανής. NoClassDefFoundError: δε μπορεί να βρεθεί ο ορισμός μίας κλάσης. StackOverflowError: ένα σφάλμα υπερχείλισης στοίβας συμβαίνει εντός της εικονικής μηχανής. UnknownError: ένα σφάλμα άγνωστης προέλευσης ανιχνεύεται στο σύστημα χρόνου εκτέλεσης. Όλα τα σφάλματα και η σημασία τους εδώ:
82
Εξαιρέσεις (Exceptions)
Standard Java error classes
83
Εξαιρέσεις (Exceptions)
Για να δηλώσουμε ένα πιθανό λάθος και να το διορθώσουμε, πρέπει πρώτα να το στείλουμε στον κατάλληλο κώδικα και αυτό γίνεται με την εντολή throw. Η γενική μορφή της εντολής είναι: throw <exception>; Όπως προαναφέρθηκε, η throw διακόπτει την φυσική ροή του προγράμματος και προσπαθεί να βρει έναν διαχειριστή εξαιρέσεων για τον τύπο της εξαίρεσης που συνέβη. Ο διαχειριστής εξαιρέσεων είναι ένα κομμάτι κώδικα, που διαχειρίζεται το ειδικό λάθος που προέκυψε. Ο κώδικας αυτός είτε ανακαλύπτει το λάθος είτε προκαλεί έξοδο από το πρόγραμμα, αν αυτό δεν μπορεί να ανακαλυφθεί. Τρεις εντολές χειρίζονται τις εξαιρέσεις και είναι οι : try, catch και finally.
84
Εξαιρέσεις (Exceptions)
Παράδειγμα: Ο παρακάτω κώδικας διαχειρίζεται λάθος (διαίρεση δια του 0) public class test{ public static void main(String args[]) { int a = Integer.valueOf(args[0]); int b = Integer.valueOf(args[1]); if (b==0) { throw new ArithmeticException("You can\'t divide by 0!"); } else { System.out.println("Result: "+(a/b));
85
Εξαιρέσεις (Exceptions)
Σύνταξη:
86
Εξαιρέσεις (Exceptions)
Η εντολή try περιέχει ένα κομμάτι κώδικα, στο οποίο στέλνεται μία εξαίρεση. Αν συμβεί η εξαίρεση, που έχει προβλέψει ο κώδικας της try, τότε μία εντολή catch με τον κατάλληλο κώδικα θα χειριστεί τον τύπο της εξαίρεσης. Εάν δεν συμβεί εξαίρεση στο τμήμα του κώδικα της try, τότε το κομμάτι του κώδικα της catch δεν εκτελείται. H εντολή finally, που συνοδεύει πάντα την try, περιέχει ένα κομμάτι κώδικα, που εκτελείται είτε συμβεί λάθος είτε όχι μέσα στην try.
87
Εξαιρέσεις (Exceptions)
Παράδειγμα: Ο παρακάτω κώδικας προκαλεί λάθος (διαίρεση δια του μηδενός) public class test{ public static void main(String args[]) { int a = 10; int b = 0; int x=a/b; System.out.println("Result: "+x); }
88
Εξαιρέσεις (Exceptions)
Το λάθος στη διαίρεση δημιουργεί εξαίρεση και το πρόγραμμα τερματίζει. Επειδή δεν έχουμε προγραμματίσει κώδικα χειρισμού της εξαίρεσης, αναλαμβάνει δράση ο χειριστής εξαιρέσεων της Java. Αυτός με τη σειρά του, εμφανίζει το μήνυμα της εξαίρεσης καθώς και ένα αντίγραφο της μνήμης στο σημείο που συνέβη, ενώ παράλληλα τερματίζει και την εκτέλεση του προγράμματος. Για να αποφύγουμε μία τέτοια κατάσταση λάθους, θα χρησιμοποιήσουμε μία try – catch εντολή. Με τον τρόπο αυτό θα αποφύγουμε το λάθος και τον απρόσμενο τερματισμό του προγράμματος. Στην try γράφουμε τον κώδικα που υποθέτουμε ότι θα προκαλέσει το λάθος και στην catch τον κώδικα που θα «πιάσει» το λάθος, δηλαδή τον τύπο εξαίρεσης που περιμένουμε.
89
Εξαιρέσεις (Exceptions)
Παράδειγμα: public class Division1{ public static void main(String args[]) { int a,b,x; try { a = 10; b = 0; x=a/b; System.out.println("Result: "+x); }
90
Εξαιρέσεις (Exceptions)
Παράδειγμα - συνέχεια: catch (ArithmeticException e) { System.out.println("Error! Divided By Zero"); } Μπορούμε να εμφανίσουμε τον τύπο της εξαίρεσης τροποποιώντας την εντολή catch: catch (ArithmeticException e) { System.out.println("Exception: " + e); }
91
Εξαιρέσεις (Exceptions)
Παράδειγμα: import java.util.*; public class Division2 { public static void main(String args[ ]) { int a, b, result; Scanner read = new Scanner(System.in); System.out.println("Input two integers"); a = read.nextInt(); b = read.nextInt(); try { result = a / b; System.out.println("Result = " + result); }
92
Εξαιρέσεις (Exceptions)
Παράδειγμα - συνέχεια: catch (ArithmeticException e) { System.out.println("Exception caught: Division by zero."); } finally { read.close(); System.exit(0);
93
Εξαιρέσεις (Exceptions)
Όσο υψηλότερη στην ιεραρχία των κλάσεων είναι η κλάση της εξαίρεσης που συντάσσετε στην catch, τόσο περισσότερα λάθη πιάνονται, όπως στο παράδειγμα που ακολουθεί: import java.io.*; public class test{ public static void main(String args[ ]) throws IOException { BufferedReader read = new BufferedReader(new InputStreamReader(System.in)); try { System.out.print("Enter a number: "); int x=Integer.parseInt(read.readLine()); System.out.println("X= "+x); }
94
Εξαιρέσεις (Exceptions)
catch (Exception exc) { System.out.println("Error: " + exc); } finally { read.close(); System.exit(0);
95
Εξαιρέσεις (Exceptions)
Δηλαδή, μπορούμε να πιάσουμε περισσότερα είδη εξαιρέσεων αν δηλώσουμε στην catch κάποια πιο γενική υπερκλάση, όπως π.χ. τη RuntimeException ή την Exception. Ο τύπος Throwable, πιάνει όλες τις εξαιρέσεις. Συνήθως όμως χρησιμοποιούμε πολλές catch εντολές. Επίσης μπορούμε να χρησιμοποιήσουμε εστιασμένες try και catch εντολές.
96
Πηγές http://homeandlearn.co.uk/index.html
Εισαγωγή στην Java 2 – Γεώργιος Λιακέας internationalization/decimalformat.html Αλγοριθμική και προγραμματισμός με Java – Παναγ. Σφέτσος Οντοκεντρικός Προγραμματισμός - Ιωάννης Χατζηλυγερούδης ntf_method_quick_reference.pdf method sheet
Παρόμοιες παρουσιάσεις
© 2024 SlidePlayer.gr Inc.
All rights reserved.