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_try_catch_block [2021/03/22 15:44] gthanos [Παράδειγμα] |
java:exceptions_try_catch_block [2021/03/23 07:25] gthanos |
||
|---|---|---|---|
| Line 67: | Line 67: | ||
| <WRAP tip 80% center round> | <WRAP tip 80% center round> | ||
| - | Η σειρά διαχείρισης των εξαιρέσεων έχει σημασία. Εφόσον, | + | Η σειρά διαχείρισης των εξαιρέσεων έχει σημασία. Εφόσον, |
| Εάν επιχειρήσετε να αντιμεταθέσετε τα δύο catch blocks αυτό που θα συμβεί είναι να λάβετε ένα μήνυμα λάθους από τον μεταγλωττιστή. Ο λόγος είναι ότι επειδή η κλάση InputMismatchException είναι υποκλάση της NoSuchElementException, | Εάν επιχειρήσετε να αντιμεταθέσετε τα δύο catch blocks αυτό που θα συμβεί είναι να λάβετε ένα μήνυμα λάθους από τον μεταγλωττιστή. Ο λόγος είναι ότι επειδή η κλάση InputMismatchException είναι υποκλάση της NoSuchElementException, | ||
| </ | </ | ||
| - | ==== Παράδειγμα 2ο - Ανοίγοντας ένα αρχείο για διάβασμα ==== | ||
| - | Παρακάτω δίνεται ένα πιο σύνθετο παράδειγμα μία μεθόδου που διαβάζει ένα αρχείο κειμένου και το επιστρέφει στη μορφή ενός String. | + | ===== Finaly Block ===== |
| - | <code java WholeFileReader.java> | + | Στον παραπάνω κώδικα, |
| - | import java.io.*; | + | |
| - | import | + | |
| - | public class WholeFileReader { | + | Η κλήση της μεθόδου όμως συμβαίνει μόνο εάν δεν παραχθεί εξαίρεση. Στην περίπτωση που παραχθεί, |
| - | | + | |
| - | public String readFile(String path) { | + | * Εάν προκύψει μια εξαίρεση ενός τύπου που δεν έχουμε φροντίσει να διαχειριστούμε, |
| + | * Εάν δεν προκύψει καμία απολύτως εξαίρεση. | ||
| + | |||
| + | Δείτε το προηγούμενο παράδειγμα, | ||
| - | try { | + | <code java ExceptionHandling.java> |
| - | /* open file for reading... | + | import java.util.Scanner; |
| - | */ | + | import java.util.NoSuchElementException; |
| - | File file = new File (path); | + | import java.util.InputMismatchException; |
| - | FileReader fReader = new FileReader(file); | + | |
| - | BufferedReader in = new BufferedReader(fReader); | + | public class ExceptionHandling |
| - | String inputLine; | + | |
| - | StringBuffer strDocument = new StringBuffer(); | + | |
| - | /* read file line by line | + | |
| - | */ | + | |
| - | while ((inputLine = in.readLine()) != null) { | + | |
| - | strDocument.append(inputLine); | + | |
| - | // | + | |
| - | } | + | |
| - | System.out.println(" | + | |
| - | /* close file and return str... | + | |
| - | */ | + | |
| - | fReader.close(); | + | |
| - | | + | |
| - | } | + | |
| - | /* If file was not found... | + | |
| - | */ | + | |
| - | catch(FileNotFoundException ex) { | + | |
| - | System.out.println(" | + | |
| - | return ""; | + | |
| - | } | + | |
| - | /* If an I/O related exception occures... | + | |
| - | */ | + | |
| - | catch(IOException ex) { | + | |
| - | System.out.println(" | + | |
| - | } | + | |
| - | return " | + | |
| - | } | + | |
| | | ||
| - | public static void main(String | + | public static void main(String []args) { |
| - | | + | |
| + | Scanner sc = new java.util.Scanner(System.in); | ||
| + | | ||
| try { | try { | ||
| - | System.out.println(wfr.readFile(args[0]) ); | + | |
| + | int width = sc.nextInt(); | ||
| + | System.out.print(" | ||
| + | int height = sc.nextInt(); | ||
| + | double ratio = width / (double)height; | ||
| + | System.out.format(" | ||
| + | } catch(InputMismatchException ex) { | ||
| + | | ||
| + | } catch(NoSuchElementException ex) { | ||
| + | System.out.println(" | ||
| } | } | ||
| - | | + | |
| - | | + | |
| } | } | ||
| - | } | + | } |
| } | } | ||
| </ | </ | ||
| - | ===== Περισσότερα του ενός catch blocks - Ιεράρχιση της σειράς εμφάνισης τους | + | ===== Try with resources block ===== |
| - | Παρατηρήστε ότι | + | Η Java παρέχει |
| - | Εάν στον παραπάνω κώδικα | + | Η κλάση [[https:// |
| - | <code java> | + | < |
| - | | + | import java.util.Scanner; |
| - | System.out.println(" | + | import java.util.NoSuchElementException; |
| - | | + | import java.util.InputMismatchException; |
| - | | + | |
| - | </ | + | |
| - | Σε αυτή την περίπτωση, | + | public class ExceptionHandling |
| - | + | ||
| - | Επίσης, | + | |
| - | <code java> | + | |
| - | catch(IOException ex) { | + | |
| - | System.out.println(" | + | |
| - | } | + | |
| - | catch(FileNotFoundException ex) { | + | |
| - | System.out.println(" | + | |
| - | return ""; | + | |
| - | } | + | |
| - | </ | + | |
| - | + | ||
| - | Σε αυτή την περίπτωση, | + | |
| - | + | ||
| - | === Δημιουργία εξαίρεσης === | + | |
| - | + | ||
| - | Τέλος, στο παραπάνω παράδειγμα βγάλτε τα σχόλια από την γραμμή '' | + | |
| - | <code java> | + | |
| - | while ((inputLine = in.readLine()) != null) { | + | |
| - | strDocument.append(inputLine); | + | |
| - | //throw new IOException(); | + | |
| - | } | + | |
| - | </ | + | |
| - | με στόχο να δημιουργήσετε ένα '' | + | |
| - | + | ||
| - | ===== Finaly Block ===== | + | |
| - | + | ||
| - | Εκτός από τα **catch** blocks τα οποία εκτελούνται όταν έχουμε κάποιο exception, μπορούμε να προσθέσουμε ένα **finaly block** το οποίο θα εκτελεστεί __σε κάθε περίπτωση__. Το **finaly block** θα εκτελεστεί στις παρακάτω περιπτώσεις: | + | |
| - | * Εάν προκύψει η εξαίρεση που έχουμε φροντίσει να διαχειριστούμε (στο παρακάτω παράδειγμα // | + | |
| - | * Εάν προκύψει μια εξαίρεση ενός τύπου που δεν έχουμε φροντίσει να διαχειριστούμε. | + | |
| - | * Εάν δεν προκύψει καμία απολύτως εξαίρεση. | + | |
| - | + | ||
| - | Δείτε το παρακάτω παράδειγμα όπου ενσωματώνει ένα **finally** block. | + | |
| - | <code java WholeFileReader.java> | + | |
| - | import java.io.*; | + | |
| - | import java.lang.*; | + | |
| - | + | ||
| - | public class WholeFileReader | + | |
| | | ||
| - | public | + | public |
| - | + | ||
| - | FileReader fReader = null; | + | try (Scanner sc = new java.util.Scanner(System.in)){ |
| - | try { | + | |
| - | File file = new File (path); | + | |
| - | fReader | + | System.out.print("Height: |
| - | BufferedReader | + | |
| - | String inputLine; | + | |
| - | StringBuffer strDocument = new StringBuffer(); | + | System.out.format("Ratio: %.2f", ratio); |
| - | | + | } catch(InputMismatchException ex) { |
| - | strDocument.append(inputLine); | + | System.out.println(" |
| - | //throw new IOException(); | + | } catch(NoSuchElementException |
| - | | + | System.out.println(" |
| - | return strDocument.toString(); | + | |
| - | } | + | |
| - | catch(FileNotFoundException ex) { | + | |
| - | System.out.println("The specified file was not found!"); | + | |
| - | | + | |
| - | } | + | |
| - | catch(IOException ex) { | + | |
| - | System.out.println("IOException occured while reading from file "+path); | + | |
| - | } | + | |
| - | finally { | + | |
| - | if(fReader!=null) { | + | |
| - | | + | |
| - | | + | |
| - | | + | |
| - | | + | |
| - | | + | |
| - | System.out.println(" | + | |
| - | } | + | |
| - | | + | |
| - | else { | + | |
| - | | + | |
| - | } | + | |
| - | | + | |
| } | } | ||
| - | return ""; | ||
| } | } | ||
| - | | ||
| - | public static void main(String args[]) { | ||
| - | WholeFileReader wfr = new WholeFileReader(); | ||
| - | try { | ||
| - | System.out.println(wfr.readFile(args[0]) ); | ||
| - | } | ||
| - | catch(IndexOutOfBoundsException ex) { | ||
| - | System.out.println(" | ||
| - | } | ||
| - | } | ||
| - | |||
| } | } | ||
| </ | </ | ||
| - | Ο λόγος που συνήθως χρησιμοποιήσουμε το **finally** block είναι για να συμπεριλάβουμε κώδικα που θέλουμε να εκτελεστεί σε όλες τις περιπτώσεις, | + | Παρατηρήστε ότι τα αντικείμενα που θέλουμε να κλείσουν αυτόματα |
| - | + | ||
| - | Στο παραπάνω παράδειγμα δείτε την πορεία | + | |
| - | <code java> | + | |
| - | while ((inputLine = in.readLine()) != null) { | + | |
| - | strDocument.append(inputLine); | + | |
| - | //throw new IOException(); | + | |
| - | } | + | |
| - | </ | + | |
| |Προηγούμενο: | |Προηγούμενο: | ||