java:exceptions_try_catch_block2

This is an old revision of the document!


A PCRE internal error occured. This might be caused by a faulty plugin

====== Διαχείριση Εξαιρέσεων ====== Στην προηγούμενη υποενότητα αναφερθήκαμε συνοπτικά στο αντικείμενο της εξαίρεσης. Εδώ θα δόυμε τον τρόπο με τον οποίο διαχειριζόμαστε τις εξαιρέσεις. ===== Try-Catch Block ===== Κάθε τμήμα του κώδικα που υπάρχει περίπτωση να πυροδοτήσει μια εξαίρεση θα πρέπει να την εμπερικλείουμε σε ένα **try block**. Το block αυτό του κώδικα θα περιγράφει τον τρόπο αντιμετώπισης της κάθε πιθανής εξαίρεσης που μπορεί να προκύψει. Ο ορισμός του block είναι ο εξής: <code java> try{ /* * code that may throw an exception here. */ }catch (ExceptionTypeOne ex) { /* * exception handler for ExceptionTypeOne objects. */ }catch (ExceptionTypeTwo ex) { /* * exception handler for ExceptionTypeOne objects. */ } </code> Εντός του **try** block βάζουμε τον κώδικα που μπορεί να δημιουργηθεί μια εξαίρεση. Κάθε **catch** block ορίζει ένα διαφορετικό τύπο εξαίρεσης μέσα σε παρένθεση (''ExceptionTypeOne'', ''ExceptionTypeTwo'', κλπ). Εάν η εξαίρεση που παράγεται συμπίπτει __ως προς τον τύπο__ της με ένα αντικείμενο που ορίζεται εντός της παρενθέσεως ενός **catch** block, τότε αυτό το block θα εκτελεστεί. Θα εκτελεστεί επομένως ο κώδικας αντιστοιχεί στον τύπο δεδομένων ο οποίος παράχθηκε από την εκάστοτε εξαίρεση. Στο προηγούμενο παράδειγμα, ας προσθέσουμε ένα τμήμα κώδικα που εντοπίζει το είδος εξαίρεσης το οποίο συναντήσαμε παραπάνω: <code java TestDivideByZero.java> import java.io.*; import java.util.Scanner; public class TestDivideByZero { public static void main (String[] args) { int x, y, result; Scanner input = new Scanner(System.in); System.out.print( "Enter first integer: " ); x = input.nextInt(); System.out.print( "Enter second integer: " ); y = input.nextInt(); try { result = x/y; System.out.printf( "Product is %d\n", result ); } catch (ArithmeticException ae) { System.out.println("ArithmeticException occured!"); if(y == 0){ System.out.println("Division by zero in particular"); } } } } </code> Όπως βλέπουμε έχουμε το προηγούμενο παράδειγμα, εμπλουτισμένο όμως με κώδικα διαχείρισης της εξαίρεση που παράγεται από τη διαίρεση ενός ακεραίου με το μηδέν. Ο κώδικας θα αναγνωρίσει ότι υπάρχει δημιουργείται ''ArithmeticException'' και συγκεκριμένα διαίρεση με το μηδέν (0) και θα εκτυπώσει τα σχετικά μηνύματα. ===== Άλλο παράδειγμα - Προσθέτοντας τους αριθμούς double που βρίσκονται μέσα σε ένα αρχείο κειμένου ===== Παρακάτω δίνεται ένα πιο σύνθετο παράδειγμα μία μεθόδου που ανοίγει ένα αρχείο κειμένου για διάβασμα, το οποίο περιέχει μόνο αριθμούς κινητής υποδιαστολής και επιστρέφει το άθροισμα των αριθμών αυτών. <code java WholeFileReader.java> import java.io.*; import java.util.*; public class MyFileReader { public static double sumFileContents(String path) { try { File file = new File (path); Scanner sc = new Scanner(file); double sum = 0.0; while(sc.hasNextDouble()) sum += sc.nextDouble(); System.out.println("Closing File!"); sc.close(); return sum; } catch(FileNotFoundException ex) { System.out.println("The specified file was not found at "+ path); } catch(NoSuchElementException ex) { System.out.println("The specified type of element was not found!"); } return 0.0; } public static void main(String args[]) { try { double result = sumFileContents(args[0]); System.out.println("Result is: "+result); } catch(IndexOutOfBoundsException ex) { System.out.println("No file has been specified from command line!\n"); } } } </code> Παρατηρήστε ότι εμφανίζονται δύο **catch** blocks. Το πρώτο catch block αφορά [[http://docs.oracle.com/javase/7/docs/api/java/io/FileNotFoundException.html|FileNotFoundException]] objects, ενώ το δεύτερο catch block αφορά [[http://docs.oracle.com/javase/7/docs/api/java/util/NoSuchElementException.html|NoSuchElementException]] objects. ===== Finaly Block ===== Εκτός από τα **catch** blocks τα οποία εκτελούνται όταν έχουμε κάποιο exception, μπορούμε να προσθέσουμε ένα **finaly block** το οποίο θα εκτελεστεί __σε κάθε περίπτωση__. Το **finaly block** θα εκτελεστεί στις παρακάτω περιπτώσεις: * Εάν προκύψει η εξαίρεση που έχουμε φροντίσει να διαχειριστούμε (στο παρακάτω παράδειγμα //FileNotFoundException//). * Εάν προκύψει μια εξαίρεση ενός τύπου που δεν έχουμε φροντίσει να διαχειριστούμε. * Εάν δεν προκύψει καμία απολύτως εξαίρεση. Δείτε το παρακάτω παράδειγμα όπου ενσωματώνει ένα **finally** block. <code java WholeFileReader.java> import java.io.*; import java.util.*; public class MyFileReaderUsingFinallyBlock { public static double sumFileContents(String path) { Scanner sc=null; try { File file = new File (path); sc = new Scanner(file); double sum = 0.0; while(sc.hasNextDouble()) sum += sc.nextDouble(); } catch(FileNotFoundException ex) { System.out.println("The specified file was not found at "+ path); } catch(NoSuchElementException ex) { System.out.println("The specified type of element was not found!"); } finally { System.out.println("Closing File!"); if(sc!=null) sc.close(); } return 0.0; } public static void main(String args[]) { try { double result = sumFileContents(args[0]); System.out.println("Result is: "+result); } catch(IndexOutOfBoundsException ex) { System.out.println("No file has been specified from command line!\n"); } } } </code> Ο λόγος που συνήθως χρησιμοποιήσουμε το **finally** block είναι για να συμπεριλάβουμε κώδικα που θέλουμε να εκτελεστεί σε όλες τις περιπτώσεις, όπως για παράδειγμα να κλείσουμε ελεγχόμενα τα αρχεία του προγράμματος ή να κλείσουμε δικτυακές συνδέσεις (π.χ. συνδέσεις με βάσεις δεδομένων κ.α.). Στο παραπάνω παράδειγμα παραλλάσσεται η μέθοδος sumFileContents του προηγούμενου παραδείγματος, ώστε στο //finally// block η μέθοδος κλείνει το αντικείμενο τύπου Scanner που άνοιξε. Η διαφορά σε σχέση με το προηγούμενο παράδειγμα είναι ότι ακόμη και εάν δημιουργηθεί ένα exception την ώρα που διαβάζουμε, η ροή του προγράμματος θα περάσει από το //finally block// και το αρχείο τελικά θα κλείσει. Αυτό δεν ισχύει στο παράδειγμα που δώσαμε προηγούμενα. Στο παραπάνω παράδειγμα δείτε την πορεία του κώδικα εάν το αρχείο από το οποίο διαβάζετε δεν περιέχει αριθμό αλλά μία λέξη. |Προηγούμενο: [[:java:exceptions_intro| Εξαιρέσεις ]] | [[ :toc | Περιεχόμενα ]] | Επόμενο: [[:java:exceptions_thrown_by_methods2 | Χειρισμός της εξαίρεσης σε υψηλότερο επίπεδο ]]|

java/exceptions_try_catch_block2.1555733441.txt.gz · Last modified: 2019/04/20 04:10 by gthanos