This shows you the differences between two versions of the page.
| Both sides previous revision Previous revision Next revision | Previous revision Next revision Both sides next revision | ||
|
java:exceptions_thrown_by_methods [2021/03/22 16:04] gthanos |
java:exceptions_thrown_by_methods [2021/03/22 21:44] gthanos [Stack Unwinding] |
||
|---|---|---|---|
| Line 1: | Line 1: | ||
| ====== Χειρισμός της εξαίρεσης σε υψηλότερο επίπεδο ====== | ====== Χειρισμός της εξαίρεσης σε υψηλότερο επίπεδο ====== | ||
| - | Ας υποθέσουμε τώρα ότι θέλουμε να | + | Ας υποθέσουμε τώρα ότι θέλουμε να επαναλάβουμε την λειτουργικότητα του προηγούμενου προγράμματος εντός της μεθόδου getRatio που καλείται από τη main, αλλά η διαχείριση της εξαίρεσης να εξακολουθεί γίνεται στη μέθοδο main. |
| - | |Προηγούμενο: | + | <code java 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(" | ||
| + | int width = sc.nextInt(); | ||
| + | System.out.print(" | ||
| + | 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(" | ||
| + | } catch(InputMismatchException ex) { | ||
| + | System.out.println(" | ||
| + | } catch(NoSuchElementException ex) { | ||
| + | System.out.println(" | ||
| + | } | ||
| + | } | ||
| + | } | ||
| + | </ | ||
| + | |||
| + | Στον παραπάνω κώδικα παρατηρούμε ότι η μέθοδος getRatio μπορεί να παράγει μία εξαίρεση, | ||
| + | |||
| + | ====== Stack Unwinding ====== | ||
| + | |||
| + | Κατά την πυροδότηση μίας εξαίρεσης το πρόγραμμα διακόπτεται στο σημείο που συμβαίνει η εξαίρεση και το JVM τερματίζει την εκτέλεση και συνεχίζει στο πρώτο catch block, το οποίο ταιριάζει στον τύπο της εξαίρεσης. Το stack της διεργασίας αναδιπλώνεται αυτόματα μέχρι το σημείο που θα βρεθεί το κατάλληλο catch block. Καμία από τις συναρτήσεις που εμπλέκονται δεν τερματίζει ομαλά μέχρι να φτάσουμε στο catch block. Δείτε το παρακάτω παράδειγμα, | ||
| + | |||
| + | <code java 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(" | ||
| + | int width = readInt(sc); | ||
| + | System.out.print(" | ||
| + | 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(" | ||
| + | } catch(InputMismatchException ex) { | ||
| + | System.out.println(" | ||
| + | } catch(NoSuchElementException ex) { | ||
| + | System.out.println(" | ||
| + | } | ||
| + | } | ||
| + | } | ||
| + | </ | ||
| + | |||
| + | Στο παραπάνω παράδειγμα, | ||
| + | |||
| + | |Προηγούμενο: | ||