This is an old revision of the document!
Table of Contents
Δημιουργία νέων τύπων εξαιρέσεων και πυροδότηση εξαίρεσης
Στις προηγούμενες ενότητες είδαμε τον τρόπο με τον οποίο χειριζόμαστε μια εξαίρεση. Μέχρι αυτό το σημείο έχουμε αναφερθεί σε εξαιρέσεις που παρέχονται από κλάσεις της βασικής βιβλιοθήκης. Πως όμως δημιουργούνται αυτές οι εξαιρέσεις και πως και εμείς μπορούμε να καλέσουμε μια εξαίρεση;
Επανερχόμενοι στο προηγούμενο παράδειγμα, θα δημιουργήσουμε μία νέα κλάση απόγονο της κλάσης java.lang.Exception.
- AbnormalSituationException.java
public class AbnormalSituationException extends java.lang.Exception { String msg = "Hello!"; public AbnormalSituationException(String msg) { this.msg = msg; } @Override public String toString() { return "[MyException] "+msg; } }
Κατά την ανάγνωση από την γραμμή εντολών, εφόσον συμβεί ένα λάθος θα διαχειριστούμε την εξαίρεση που προκύπτει και στη συνέχεια θα παράγουμε ένα αντικείμενο της παραπάνω εξαίρεσης του οποίου η διαχείριση θα γίνει στη main.
- ExceptionHandling.java
import java.util.Scanner; import java.util.NoSuchElementException; import java.util.InputMismatchException; public class ExceptionHandling { public static int readInt(Scanner sc) throws AbnormalSituationException { try { return sc.nextInt(); } catch(NoSuchElementException ex) { throw new AbnormalSituationException("Something bad happened!"); } } public static double getRatio(Scanner sc) throws AbnormalSituationException { System.out.println("Width: "); int width = readInt(sc); System.out.println("Height: "); 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("Ratio: %.2f", ratio); } catch(AbnormalSituationException ex) { System.out.println(ex); StackTraceElement[] st = ex.getStackTrace(); for(StackTraceElement e: st) System.out.println(e); } } }
Παραγωγή εξαίρεσης
Όπως τονίσαμε και παραπάνω η εξαίρεση είναι και αυτή ένα αντικείμενο. Για να παράγουμε μία εξαίρεση πρέπει να βάλουμε τη δεσμευμένη λέξη throw και δίπλα το αντικείμενο της εξαίρεσης που θέλουμε να καλέσουμε. Στο παρακάτω παράδειγμα, εάν μετά την ολοκλήρωση διαβάσματος του αρχείου αντιληφθούμε ότι το αρχείο που διαβάσαμε ήταν κενό τότε το πρόγραμμα μας δημιουργεί μία εξαίρεση του τύπου EmptyFileException. Δείτε τον κώδικα.
- WholeFileReader.java
import java.io.*; import java.lang.*; public class WholeFileReader { public String readFile(String path) throws FileNotFoundException, EmptyFileException { FileReader fReader = null; try { File file = new File (path); fReader = new FileReader(file); BufferedReader in = new BufferedReader(fReader); String inputLine; StringBuffer strDocument = new StringBuffer(); try { while ((inputLine = in.readLine()) != null) { strDocument.append(inputLine); } } catch(IOException ex) { System.out.println("IOException occured while reading from file "+path); } if( strDocument.toString().isEmpty() ) { throw new EmptyFileException(); } return strDocument.toString(); } finally { if( fReader != null) { try { //System.out.println("Closing file"); fReader.close(); } catch(IOException ex) { System.out.println("IOException occured while reading from file "+path); } } } } public static void main(String args[]) { WholeFileReader wfr = new WholeFileReader(); try { System.out.println(wfr.readFile(args[0]) ); } catch(IndexOutOfBoundsException ex) { System.out.println("No file has been specified!\n"); } catch(FileNotFoundException ex) { System.out.println("The specified file was not found at "+ args[0]); } catch(EmptyFileException ex) { System.out.println("File is empty!!!"); } } }
Προηγούμενο: Χειρισμός της εξαίρεσης σε υψηλότερο επίπεδο | Περιεχόμενα | Επόμενο: try-with-resources block |