java:exceptions_try_catch_block
Differences
This shows you the differences between two versions of the page.
Both sides previous revisionPrevious revisionNext revision | Previous revision | ||
java:exceptions_try_catch_block [2017/03/10 10:34] – [Παράδειγμα 1ο - Διαίρεση με μηδέν (0)] gthanos | java:exceptions_try_catch_block [2021/03/23 07:29] (current) – [Try with resources block] gthanos | ||
---|---|---|---|
Line 30: | Line 30: | ||
Εντός του **try** block βάζουμε τον κώδικα που μπορεί να δημιουργηθεί μια εξαίρεση. Κάθε **catch** block ορίζει ένα διαφορετικό τύπο εξαίρεσης μέσα σε παρένθεση ('' | Εντός του **try** block βάζουμε τον κώδικα που μπορεί να δημιουργηθεί μια εξαίρεση. Κάθε **catch** block ορίζει ένα διαφορετικό τύπο εξαίρεσης μέσα σε παρένθεση ('' | ||
- | ==== Παράδειγμα | + | ==== Παράδειγμα ==== |
- | Ας δούμε | + | Στο προηγούμενο πρόγραμμα |
- | <code java TestDivideByZero.java> | + | Παρατηρήστε επίσης ότι η κλάση [[https:// |
- | 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: " | + | <code java ExceptionHandling.java> |
- | | + | import java.util.Scanner; |
+ | import java.util.NoSuchElementException; | ||
+ | import java.util.InputMismatchException; | ||
+ | |||
+ | public class ExceptionHandling { | ||
+ | |||
+ | public static void main(String []args) { | ||
+ | | ||
+ | Scanner sc = new java.util.Scanner(System.in); | ||
| | ||
try { | try { | ||
- | result | + | System.out.print(" |
- | System.out.printf( "Product is %d\n", | + | int width = sc.nextInt(); |
- | } catch (ArithmeticException ae) { | + | System.out.print(" |
- | System.out.println(" | + | int height = sc.nextInt(); |
- | if(y == 0){ | + | double ratio = width / (double)height; |
- | System.out.println(" | + | System.out.format("Ratio: |
- | } | + | sc.close(); |
+ | } catch(InputMismatchException ex) { | ||
+ | System.out.println(" | ||
+ | } catch(NoSuchElementException ex) { | ||
+ | System.out.println(" | ||
} | } | ||
- | | ||
} | } | ||
} | } | ||
</ | </ | ||
- | Όπως βλέπουμε έχουμε το προηγούμενο παράδειγμα, | + | <WRAP tip 80% center round> |
+ | Η σειρά διαχείρισης των εξαιρέσεων έχει σημασία. Εφόσον, δημιουργηθεί μία εξαίρεση, το JVM ελέγχει εάν πρόκειται για εξαίρεση του πρώτου catch block, δηλαδή του τύπου [[https:// | ||
- | ==== Παράδειγμα 2ο - Ανοίγοντας | + | Εάν επιχειρήσετε να αντιμεταθέσετε τα δύο catch blocks αυτό που θα συμβεί είναι να λάβετε ένα μήνυμα λάθους από τον μεταγλωττιστή. Ο λόγος είναι ότι επειδή η κλάση InputMismatchException είναι υποκλάση της [[https:// |
+ | </ | ||
- | Παρακάτω δίνεται ένα πιο σύνθετο παράδειγμα μία μεθόδου που διαβάζει ένα αρχείο κειμένου και το επιστρέφει στη μορφή ενός String. | ||
- | <code java WholeFileReader.java> | + | ===== Finaly Block ===== |
- | import java.io.*; | + | |
- | import java.lang.*; | + | |
- | public class WholeFileReader { | + | Στον παραπάνω κώδικα, |
- | + | ||
- | public String readFile(String path) { | + | |
- | try { | + | Η κλήση της μεθόδου όμως συμβαίνει μόνο εάν δεν παραχθεί εξαίρεση. Στην περίπτωση που παραχθεί, |
- | File file = new File (path); | + | * Εάν προκύψει η εξαίρεση που έχουμε φροντίσει να διαχειριστούμε |
- | | + | * Εάν προκύψει μια εξαίρεση ενός τύπου που δεν έχουμε φροντίσει να διαχειριστούμε, |
- | | + | * Εάν δεν προκύψει καμία απολύτως εξαίρεση. |
- | String inputLine; | + | |
- | StringBuffer strDocument = new StringBuffer(); | + | Δείτε το προηγούμενο παράδειγμα, |
- | while ((inputLine = in.readLine()) != null) { | + | |
- | | + | <code java ExceptionHandling.java> |
- | // | + | import java.util.Scanner; |
- | } | + | import java.util.NoSuchElementException; |
- | System.out.println(" | + | import java.util.InputMismatchException; |
- | | + | |
- | | + | public class ExceptionHandling { |
- | } | + | |
- | catch(FileNotFoundException ex) { | + | |
- | System.out.println(" | + | |
- | | + | |
- | } | + | |
- | 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 { | + | |
- | | + | |
- | | + | |
- | | + | |
- | | + | |
- | | + | |
- | | + | } catch(InputMismatchException ex) { |
- | | + | |
- | // | + | } catch(NoSuchElementException ex) { |
- | | + | |
- | return strDocument.toString(); | + | |
} | } | ||
- | catch(FileNotFoundException ex) { | ||
- | System.out.println(" | ||
- | return ""; | ||
- | } | ||
- | catch(IOException ex) { | ||
- | System.out.println(" | ||
- | } | ||
- | finally { | ||
- | if(fReader!=null) { | ||
- | try{ | ||
- | System.out.println(" | ||
- | fReader.close(); | ||
- | } | ||
- | catch(IOException ex) { | ||
- | System.out.println(" | ||
- | } | ||
- | } | ||
- | else { | ||
- | System.out.println(" | ||
- | } | ||
- | | ||
- | } | ||
- | 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(); | + | |
- | } | + | |
- | </ | + | |
|Προηγούμενο: | |Προηγούμενο: | ||
java/exceptions_try_catch_block.1489142078.txt.gz · Last modified: 2017/03/10 10:34 by gthanos