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 [2020/02/27 20:04] – [Περισσότερα του ενός catch blocks - Ιεράρχιση της σειράς εμφάνισης τους] 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; | + | |
- | while(true) { | + | |
- | + | ||
- | 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> |
- | y = input.nextInt(); | + | import java.util.Scanner; |
- | + | import java.util.NoSuchElementException; | |
- | try { | + | import java.util.InputMismatchException; |
- | result = x/y; | + | |
- | System.out.printf( " | + | |
- | } catch (ArithmeticException ae) { | + | |
- | System.out.println(" | + | |
- | if(y == 0){ | + | |
- | System.out.println(" | + | |
- | } | + | |
- | } | + | |
- | } | + | |
- | } | + | |
- | } | + | |
- | </ | + | |
- | Όπως βλέπουμε έχουμε το προηγούμενο παράδειγμα, | + | public class ExceptionHandling |
- | + | ||
- | ==== Παράδειγμα 2ο - Ανοίγοντας ένα αρχείο για διάβασμα ==== | + | |
- | + | ||
- | Παρακάτω δίνεται ένα πιο σύνθετο παράδειγμα μία μεθόδου που διαβάζει ένα αρχείο κειμένου και το επιστρέφει στη μορφή ενός String. | + | |
- | + | ||
- | <code java WholeFileReader.java> | + | |
- | import java.io.*; | + | |
- | import java.lang.*; | + | |
- | + | ||
- | public class WholeFileReader | + | |
| | ||
- | public | + | public |
+ | |||
+ | Scanner sc = new java.util.Scanner(System.in); | ||
+ | | ||
try { | try { | ||
- | | + | |
- | | + | |
- | | + | |
- | | + | |
- | | + | |
- | | + | |
- | | + | sc.close(); |
- | // | + | } catch(InputMismatchException ex) { |
- | } | + | System.out.println(" |
- | System.out.println(" | + | } catch(NoSuchElementException ex) { |
- | | + | |
- | | + | |
} | } | ||
- | catch(FileNotFoundException ex) { | ||
- | System.out.println(" | ||
- | return ""; | ||
- | } | ||
- | catch(IOException ex) { | ||
- | 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(" | ||
- | } | ||
- | } | ||
- | |||
} | } | ||
</ | </ | ||
- | ===== Περισσότερα | + | <WRAP tip 80% center round> |
+ | Η σειρά διαχείρισης των εξαιρέσεων έχει σημασία. Εφόσον, | ||
- | Παρατηρήστε | + | Εάν επιχειρήσετε να αντιμεταθέσετε |
+ | </ | ||
- | Εάν στον παραπάνω κώδικα παραλείπονταν οι γραμμές: | ||
- | <code java> | + | ===== Finaly Block ===== |
- | catch(FileNotFoundException ex) { | + | |
- | System.out.println(" | + | |
- | return ""; | + | |
- | } | + | |
- | </ | + | |
- | Σε αυτή την περίπτωση, ο μη εντοπισμός αρχείου θα ενέπιπτε σε '' | + | Στον παραπάνω κώδικα, εμφανίζεται |
- | Επίσης, δεν θα είχε κανένα νόημα να βάλουμε τα δύο παραπάνω catch blocks | + | Η κλήση της μεθόδου όμως συμβαίνει μόνο εάν δεν παραχθεί εξαίρεση. Στην περίπτωση που παραχθεί, το αντικείμενο θα παραμείνει ενεργό, πράγμα που σε ένα μεγαλύτερο πρόγραμμα δεν θα ήταν επιθυμητό (στο παρόν πρόγραμμα, το αντικείμενο θα κλείσει αμέσως μετά με την ολοκλήρωση του προγράμματος). Για το σκοπό αυτό εισάγεται η έννοια του finally block, ως ένα block που έπεται των catch blocks και σκοπό έχει να εκτελεστεί σε όλες τις περιπτώσεις, |
- | <code java> | + | * Εάν προκύψει η εξαίρεση που έχουμε φροντίσει να διαχειριστούμε (στο παρακάτω |
- | | + | * Εάν προκύψει |
- | System.out.println(" | + | * Εάν δεν προκύψει καμία απολύτως εξαίρεση. |
- | | + | |
- | catch(FileNotFoundException ex) { | + | |
- | System.out.println(" | + | |
- | return ""; | + | |
- | } | + | |
- | </ | + | |
- | Σε αυτή την περίπτωση, εάν παραχθεί ένα // | + | Δείτε το προηγούμενο παράδειγμα, αλλαγμένο |
- | === Δημιουργία εξαίρεσης === | + | <code java ExceptionHandling.java> |
+ | import java.util.Scanner; | ||
+ | import java.util.NoSuchElementException; | ||
+ | import java.util.InputMismatchException; | ||
- | Τέλος, στο παραπάνω παράδειγμα βγάλτε τα σχόλια από την γραμμή '' | + | public class ExceptionHandling { |
- | <code java> | + | |
- | while ((inputLine | + | public static void main(String []args) { |
- | | + | |
- | // | + | Scanner sc = new java.util.Scanner(System.in); |
- | } | + | |
+ | try { | ||
+ | System.out.print(" | ||
+ | int width = sc.nextInt(); | ||
+ | System.out.print(" | ||
+ | int height | ||
+ | double ratio = width / (double)height; | ||
+ | System.out.format(" | ||
+ | } catch(InputMismatchException ex) { | ||
+ | | ||
+ | } catch(NoSuchElementException ex) { | ||
+ | System.out.println(" | ||
+ | } | ||
+ | finally { | ||
+ | | ||
+ | } | ||
+ | } | ||
+ | } | ||
</ | </ | ||
- | με στόχο να δημιουργήσετε ένα '' | ||
- | ===== Finaly Block ===== | + | ===== Try with resources block ===== |
- | Εκτός από τα **catch** blocks τα οποία εκτελούνται όταν έχουμε | + | Η Java παρέχει τη δυνατότητα για αυτόματo κλείσιμο |
- | * Εάν προκύψει η εξαίρεση που έχουμε φροντίσει | + | |
- | * Εάν προκύψει μια εξαίρεση ενός τύπου που δεν έχουμε φροντίσει να διαχειριστούμε. | + | |
- | * Εάν δεν προκύψει καμία απολύτως εξαίρεση. | + | |
- | Δείτε | + | Η κλάση [[https:// |
- | <code java WholeFileReader.java> | + | |
- | import java.io.*; | + | |
- | import java.lang.*; | + | |
- | public class WholeFileReader { | + | <code java ExceptionHandling.java> |
- | + | import java.util.Scanner; | |
- | | + | import java.util.NoSuchElementException; |
+ | import java.util.InputMismatchException; | ||
- | FileReader fReader = null; | + | public class ExceptionHandling |
- | try { | + | |
- | File file = new File (path); | + | |
- | fReader = new FileReader(file); | + | |
- | BufferedReader in = new BufferedReader(fReader); | + | |
- | String inputLine; | + | |
- | StringBuffer strDocument = new StringBuffer(); | + | |
- | while ((inputLine = in.readLine()) != null) { | + | |
- | strDocument.append(inputLine); | + | |
- | //throw new IOException(); | + | |
- | } | + | |
- | 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 | + | public static void main(String []args) { |
- | | + | |
- | try { | + | try (Scanner sc = new java.util.Scanner(System.in)){ |
- | System.out.println(wfr.readFile(args[0]) ); | + | System.out.print(" |
- | } | + | int width = sc.nextInt(); |
- | catch(IndexOutOfBoundsException | + | System.out.print(" |
- | System.out.println(" | + | int height = sc.nextInt(); |
+ | double ratio = width / (double)height; | ||
+ | System.out.format(" | ||
+ | } catch(InputMismatchException ex) { | ||
+ | System.out.println(" | ||
+ | | ||
+ | System.out.println(" | ||
} | } | ||
} | } | ||
- | |||
} | } | ||
</ | </ | ||
- | Ο λόγος που συνήθως χρησιμοποιήσουμε το **finally** block είναι για να συμπεριλάβουμε κώδικα που θέλουμε να εκτελεστεί σε όλες τις περιπτώσεις, | + | Τα αντικείμενα που θέλουμε να κλείσουν αυτόματα |
- | + | ||
- | Στο παραπάνω παράδειγμα δείτε την πορεία | + | |
- | <code java> | + | |
- | while ((inputLine = in.readLine()) != null) { | + | |
- | strDocument.append(inputLine); | + | |
- | //throw new IOException(); | + | |
- | } | + | |
- | </ | + | |
|Προηγούμενο: | |Προηγούμενο: | ||
java/exceptions_try_catch_block.1582833841.txt.gz · Last modified: 2020/02/27 20:04 (external edit)