This is an old revision of the document!
Table of Contents
Χειρισμός της εξαίρεσης σε υψηλότερο επίπεδο
Ας υποθέσουμε τώρα ότι θέλουμε να επαναλάβουμε την λειτουργικότητα του προηγούμενου προγράμματος εντός της μεθόδου getRatio που καλείται από τη main, αλλά η διαχείριση της εξαίρεσης να εξακολουθεί γίνεται στη μέθοδο main.
- ExceptionHandling.java
import java.util.Scanner; import java.util.NoSuchElementException; import java.util.InputMismatchException; public class ExceptionHandling { public static double getRatio(Scanner sc) throws NoSuchElementException { System.out.print("Width: "); int width = sc.nextInt(); System.out.print("Height: "); int height = sc.nextInt(); return width / (double)height; } public static void main(String []args) { try (Scanner sc = new java.util.Scanner(System.in)){ double ratio = getRatio(sc); System.out.format("Ratio: %.2f", ratio); } catch(InputMismatchException ex) { System.out.println("Input doen not match integer value."); } catch(NoSuchElementException ex) { System.out.println("You have closed the input from command line."); } } }
Στον παραπάνω κώδικα παρατηρούμε ότι η μέθοδος getRatio μπορεί να παράγει μία εξαίρεση, αλλά η διαχείριση της γίνεται από τη μέθοδο που την καλεί, δηλαδή τη μέθοδο main. Η μέθοδος getRatio δεν περιέχει try/catch block, είμαστε όμως υποχρεωμένοι να δηλώσουμε σε αυτή ότι παράγει ένα exception του τύπου NoSuchElementException (ο τύπος εμπεριέχει όλες τις απογόνους κλάσεις όπως την κλάση InputMismatchException).
Stack Unwinding
Κατά την πυροδότηση μίας εξαίρεσης το πρόγραμμα διακόπτεται στο σημείο που συμβαίνει η εξαίρεση και το JVM τερματίζει την εκτέλεση και συνεχίζει στο πρώτο catch block, το οποίο ταιριάζει στον τύπο της εξαίρεσης. Το stack της διεργασίας αναδιπλώνεται αυτόματα μέχρι το σημείο που θα βρεθεί το κατάλληλο catch block. Καμία από τις συναρτήσεις που εμπλέκονται δεν τερματίζει ομαλά μέχρι να φτάσουμε στο catch block. Δείτε το παρακάτω παράδειγμα, στο οποίο η πιθανή εξαίρεση παράγεται μέσα στη μέθοδος readInt.
- ExceptionHandling.java
import java.util.Scanner; import java.util.NoSuchElementException; import java.util.InputMismatchException; public class ExceptionHandling_6 { public static int readInt(Scanner sc) throws NoSuchElementException { return sc.nextInt(); } public static double getRatio(Scanner sc) throws NoSuchElementException { System.out.print("Width: "); int width = readInt(sc); System.out.print("Height: "); int height = readInt(sc); return width / (double)height; } public static void main(String []args) { double ratio = -1.0; try (Scanner sc = new java.util.Scanner(System.in)){ ratio = getRatio(sc); System.out.format("Ratio: %.2f", ratio); } catch(InputMismatchException ex) { System.out.println("Input doen not match integer value."); } catch(NoSuchElementException ex) { System.out.println("You have closed the input from command line."); } } }
Στο παραπάνω παράδειγμα, όταν θα συμβεί μία εξαίρεση στη μέθοδο readInt, ο κώδικας σταματήσει την εκτέλεση του και καμία από τις συναρτήσεις που έχουν κληθεί δεν θα επιστρέψει ομαλά. Αυτό που θα συμβεί είναι ότι ο κώδικας θα συνεχίσει να εκτελείται στο κατάλληλο catch block μέσα στη μέθοδο main. Στο παράδειγμα, η μεταβλητή ratio έχει την τιμή -1.0 με την οποία αρχικοποιήθηκε.
Προηγούμενο: Διαχείριση Εξαιρέσεων | Περιεχόμενα | Επόμενο: Δημιουργία νέων τύπων εξαιρέσεων και πυροδότηση εξαιρέσεων |