User Tools

Site Tools


java:exceptions_try_with_resources

Differences

This shows you the differences between two versions of the page.

Link to this comparison view

Both sides previous revisionPrevious revision
Next revision
Previous revision
java:exceptions_try_with_resources [2015/03/10 14:36] gthanosjava:exceptions_try_with_resources [2021/03/22 21:44] (current) – external edit 127.0.0.1
Line 1: Line 1:
-====== try-with-resources Block ======+====== Δημιουργία αντικειμένων και εξαιρέσεις ======
  
-Ας επανέλθουμε στον αρχικό κώδικα που χρησιμοποιήσαμε για να διαβάσουμε ένα αρχείο. Εδώ θα παρουσιάσουμε μία παραλλαγή του κώδικα που παρουσιάστηκε νωρίτερα με χρήση ενός ιδιαίτερου **try** block.+Ας υποθέσουμε ότι έχουμε το παράδειγμα του ορθογωνίου παραλληλογράμμου που είχαμε συναντήσει και στο παρελθόν. Στα παραδείγματα που έχουμε δει μέχρι τώρα, το ορθογώνιο παραλληλόγραμμο λαμβάνει ως παραμέτρους ακέραιους για τις τιμές του πλάτους και το ύψους. Οι ακέραιοι αυτοί υποθέτουμε ότι είναι πάντα θετικοί. Τι θα συμβεί όμως αν κατά την κλήση του κατασκευαστή δοθεί αρνητικό όρισμα για το πλάτος ή το ύψος; Η κλήση του κατασκευαστή με ένα αρνητικό όρισμα θα δημιουργούσε λογικό πρόβλημα στο αντικείμενο που δημιουργείται.
  
-<code java WholeFileReader.java+<WRAP tip 80% center round
-import java.io.*; +Επειδή οι κατασκευαστές δεν επιστρέφουν καμία τιμή, δεν υπάρχει η δυνατότητα να σηματοδοτηθεί ότι συνέβη κάποιο σφάλμα ή απέτυχε η αρχικοποίηση του αντικειμένουΠροκειμένου να αντιμετωπιστεί το παραπάνω πρόβλημα μπορούμε να χρησιμοποιήσουμε το μηχανισμό των εξαιρέσεων
-import java.lang.*;+</WRAP>
  
-public class WholeFileReader { +Στο παρακάτω παράδειγμα του ορθογωνίου παραλληλογράμμου κάθε φορά που δίνεται αρνητικό όρισμα ή μηδέν παράγεται μία εξαίρεση του τύπου [[https://docs.oracle.com/javase/7/docs/api/java/lang/IllegalArgumentException.html|java.lang.IllegalArgumentException]]. Η δημιουργία του αντικειμένου διακόπτεται και το πρόγραμμα μας συνεχίζει την εκτέλεση του έχοντας αποτύχει η αρχικοποίηση του αντικειμένου.
-   +
-  public String readFile(String path) {+
  
-    try ( FileReader fReader = new FileReader(new File (path)) )       +<code java Rectangle.java> 
-      BufferedReader in = new BufferedReader(fReader)+public class Rectangle 
-      String inputLine; +  int width, height
-      StringBuffer strDocument = new StringBuffer(); +   
-      while ((inputLine in.readLine()) !null{ +  public Rectangle(int width, int height{ 
-        strDocument.append(inputLine); +    ifwidth <0 || height <0
-        //throw new IOException(); +      throw new IllegalArgumentException(); 
-      } +    this.width = width
-      fReader.close(); +    this.height = height;
-      return strDocument.toString()+
-    +
-    catch(IOException ex) { +
-      System.out.println("IOException occured while reading from file "+path); +
-    } +
-     +
-    return "";+
   }   }
      
-  public static void main(String args[]) { +  public int getWidth() { 
-    WholeFileReader wfr = new WholeFileReader()+    return width
-    try { +  } 
-      System.out.println(wfr.readFile(args[0]) ); +   
-    +  public int getHeight() 
-    catch(IndexOutOfBoundsException ex) { +    return height
-      System.out.println("No file has been specified from command line!\n"); +  
-    }+   
 +  @Override 
 +  public String toString() { 
 +    return "width: "+width+", height: "+height;
   }   }
- 
 } }
 </code> </code>
  
-Από τον παραπάνω κώδικα ξεχωρίζει η δήλωση της μορφής  +<code java SafelyCreateRectangle.java> 
-<code java> +import java.util.Scanner;
-    try ( FileReader fReader = new FileReader(new File (path)) ) {  +
-    } +
-</code>+
  
-όπου ανοίγουμε ένα resource πριν εισέλθουμε στο σώμα του **try** block. Σε αυτό το τμήμα κώδικα η ιδιαιτερότητα είναι ότι δεν χρειάζεται να ανησυχούμε για το αν θα κλείσω σωστά το FileReader object ή όχι. Ανεξάρτητα από το αν θα δημιουργηθεί Exception ή όχι, το **JVM** θα αναλάβει να κλείσει το FileReader object αν αυτό παραμένει ανοιχτό. Απαραίτητη προϋπόθεση για να συμβεί το παραπάνω είναι η κλάση του αντικειμένου που θα δημιουργηθεί να υποστηρίζει το interface [[http://docs.oracle.com/javase/7/docs/api/java/lang/AutoCloseable.html|java.lang.Autoclosable]] ή ένα από τα sub-interfaces αυτού (π.χ[[http://docs.oracle.com/javase/7/docs/api/java/io/Closeable.html|java.io.Closable]]). +public class SafelyCreateRectangle { 
- +  public static void main(String []args) { 
-Στην ίδια λογική μπορούμε να έχουμε περισσότερες από μία δηλώσεις κώδικα μέσα στην παρένθεση του try block όπως παρακάτω +    Scanner sc = new Scanner(System.in); 
-<code java> +     
-try ( +    while(true) { 
-        java.util.zip.ZipFile zf = +      System.out.print("Width"); 
-             new java.util.zip.ZipFile(zipFileName); +      int width = sc.nextInt(); 
-        java.io.BufferedWriter writer =  +      System.out.print("Height: ")
-            java.nio.file.Files.newBufferedWriter(outputFilePath, charset+      int height = sc.nextInt(); 
-    ) {+      Rectangle r; 
 +      try { 
 +        = new Rectangle(width, height); 
 +        System.out.println(r); 
 +        break; 
 +      } 
 +      catch(IllegalArgumentException ex) { 
 +        System.out.println("Invalid ArgumentTry again..")
 +      } 
 +    
 +  } 
 +}
 </code> </code>
  
-|Προηγούμενο: [[:java:exceptions_throwing | Δημιουργία και πυροδότηση εξαιρέσεων]] | Επόμενο: [[:java:exception_categories | Κατηγορίες Εξαιρέσεων ]]|+|Προηγούμενο: [[:java:exceptions_throwing | Δημιουργία νέων τύπων εξαιρέσεων και πυροδότηση εξαιρέσεων]] | [[ :toc | Περιεχόμενα ]]| Επόμενο: [[:java:exception_categories | Κατηγορίες Εξαιρέσεων ]]|
  
java/exceptions_try_with_resources.1425998160.txt.gz · Last modified: 2015/03/10 14:36 by gthanos