Σε αυτό το σεμινάριο, θα μάθουμε να χρησιμοποιούμε λέξη-κλειδί ρίψης και ρίψης για χειρισμό εξαιρέσεων με τη βοήθεια παραδειγμάτων.
Στην Java, οι εξαιρέσεις μπορούν να κατηγοριοποιηθούν σε δύο τύπους:
- Ένα μη ελεγμένο Εξαιρέσεις: Δεν ελέγχονται κατά τη μεταγλώττιση χρόνο, αλλά σε run-χρόνο.Για παράδειγμα:
ArithmeticException
,NullPointerException
,ArrayIndexOutOfBoundsException
, εξαιρέσεις σύμφωνα μεError
την κατηγορία, κ.λπ. - Έλεγχοι Εξαιρέσεις: Ελέγχονται κατά το χρόνο μεταγλώττισης. Για παράδειγμα,
IOException
,InterruptedException
, κ.λπ.
Ανατρέξτε στις Εξαιρέσεις Java για να μάθετε λεπτομερώς σχετικά με τις ελεγμένες και τις μη ελεγμένες εξαιρέσεις.
Συνήθως, δεν χρειάζεται να χειριστούμε μη ελεγμένες εξαιρέσεις. Αυτό συμβαίνει επειδή οι μη ελεγμένες εξαιρέσεις συμβαίνουν λόγω σφαλμάτων προγραμματισμού. Και, είναι καλή πρακτική να τα διορθώνετε αντί να τα χειρίζεστε.
Αυτό το σεμινάριο θα εστιάσει τώρα στο πώς να λαβή ελέγχονται εξαιρέσεις χρησιμοποιώντας throw
και throws
.
Η Java ρίχνει τη λέξη-κλειδί
Χρησιμοποιούμε τη throws
λέξη-κλειδί στη δήλωση μεθόδου για να δηλώσουμε τον τύπο εξαιρέσεων που ενδέχεται να προκύψουν μέσα σε αυτήν.
Η σύνταξή του είναι:
accessModifier returnType methodName() throws ExceptionType1, ExceptionType2… ( // code )
Όπως μπορείτε να δείτε από την παραπάνω σύνταξη, μπορούμε να χρησιμοποιήσουμε throws
για να δηλώσουμε πολλές εξαιρέσεις.
Παράδειγμα 1: Η Java ρίχνει τη λέξη-κλειδί
import java.io.*; class Main ( public static void findFile() throws IOException ( // code that may produce IOException File newFile=new File("test.txt"); FileInputStream stream=new FileInputStream(newFile); ) public static void main(String() args) ( try( findFile(); ) catch(IOException e)( System.out.println(e); ) ) )
Παραγωγή
java.io.FileNotFoundException: test.txt (Δεν υπάρχει τέτοιο αρχείο ή κατάλογος)
Όταν εκτελούμε αυτό το πρόγραμμα, εάν το αρχείο test.txt
δεν υπάρχει, FileInputStream
ρίχνει ένα FileNotFoundException
που επεκτείνει την IOException
κλάση.
Εάν μια μέθοδος δεν χειρίζεται εξαιρέσεις, ο τύπος των εξαιρέσεων που ενδέχεται να προκύψουν μέσα σε αυτήν πρέπει να προσδιοριστεί στην throws
ενότητα έτσι ώστε οι μέθοδοι που βρίσκονται στη στοίβα κλήσεων να μπορούν να τις χειριστούν ή να τις καθορίσουν χρησιμοποιώντας τη throws
λέξη-κλειδί.
Η findFile()
μέθοδος καθορίζει ότι IOException
μπορεί να ρίξει. Η main()
μέθοδος καλεί αυτή τη μέθοδο και χειρίζεται την εξαίρεση εάν ρίχνεται.
Ρίχνουν πολλές εξαιρέσεις
Δείτε πώς μπορούμε να ρίξουμε πολλές εξαιρέσεις χρησιμοποιώντας τη throws
λέξη-κλειδί.
import java.io.*; class Main ( public static void findFile() throws NullPointerException, IOException, InvalidClassException ( // code that may produce NullPointerException… … … // code that may produce IOException… … … // code that may produce InvalidClassException… … … ) public static void main(String() args) ( try( findFile(); ) catch(IOException e1)( System.out.println(e1.getMessage()); ) catch(InvalidClassException e2)( System.out.println(e2.getMessage()); ) ) )
Εδώ, η findFile()
μέθοδος ορίζει ότι μπορεί να ρίξει NullPointerException
, IOException
και InvalidClassException
το της throws
ρήτρας.
Σημειώστε ότι δεν έχουμε χειριστεί το NullPointerException
. Αυτό συμβαίνει επειδή είναι μια ανεξέλεγκτη εξαίρεση. Δεν είναι απαραίτητο να το προσδιορίσετε στην throws
ενότητα και να το χειριστείτε.
ρίχνει τη λέξη-κλειδί Vs. δοκιμάστε … πιάστε … επιτέλους
Μπορεί να υπάρχουν πολλές μέθοδοι που μπορούν να προκαλέσουν εξαιρέσεις. Το γράψιμο try… catch
για κάθε μέθοδο θα είναι κουραστικό και ο κώδικας γίνεται μακρύς και λιγότερο ευανάγνωστος.
throws
είναι επίσης χρήσιμο όταν έχετε ελέγξει την εξαίρεση (μια εξαίρεση που πρέπει να αντιμετωπιστεί) που δεν θέλετε να πιάσετε με την τρέχουσα μέθοδο σας.
Λέξη κλειδί Java
Η throw
λέξη-κλειδί χρησιμοποιείται για να ρίξει ρητά μια εξαίρεση.
Όταν δημιουργείται μια εξαίρεση, η ροή της εκτέλεσης του προγράμματος μεταφέρεται από το try
μπλοκ στο catch
μπλοκ. Χρησιμοποιούμε τη throw
λέξη-κλειδί μέσα σε μια μέθοδο.
Η σύνταξή του είναι:
throw throwableObject;
Ένα αντικείμενο με δυνατότητα ρίψης είναι μια παρουσία κλάσης Throwable
ή υποκατηγορίας της Throwable
κλάσης.
Παράδειγμα 2: Λέξη-κλειδί Java
class Main ( public static void divideByZero() ( throw new ArithmeticException("Trying to divide by 0"); ) public static void main(String() args) ( divideByZero(); ) )
Παραγωγή
Εξαίρεση στο νήμα "main" java.lang.ArithmeticException: Προσπάθεια διαίρεσης με 0 στο Main.divideByZero (Main.java:3) στο Main.main (Main.java:7) κατάσταση εξόδου 1
Σε αυτό το παράδειγμα, ρίχνουμε ρητά ένα ArithmeticException.
Σημείωση: ArithmeticException
είναι μια μη ελεγμένη εξαίρεση. Συνήθως δεν είναι απαραίτητο να χειριστείτε μη ελεγμένες εξαιρέσεις.
Παράδειγμα 3: Ρίψη ελεγμένης εξαίρεσης
import java.io.*; class Main ( public static void findFile() throws IOException ( throw new IOException("File not found"); ) public static void main(String() args) ( try ( findFile(); System.out.println("Rest of code in try block"); ) catch (IOException e) ( System.out.println(e.getMessage()); ) ) )
Παραγωγή
Το αρχείο δε βρέθηκε
Η findFile()
μέθοδος ρίχνει ένα IOException
με το μήνυμα που περάσαμε στον κατασκευαστή του.
Σημειώστε ότι δεδομένου ότι είναι μια ελεγχόμενη εξαίρεση, πρέπει να την καθορίσουμε στην throws
ενότητα.
Οι μέθοδοι που ονομάζουν αυτήν τη findFile()
μέθοδο πρέπει είτε να χειριστούν αυτήν την εξαίρεση είτε να την προσδιορίσουν χρησιμοποιώντας τη throws
λέξη-κλειδί από μόνες τους.
Έχουμε χειριστεί αυτήν την εξαίρεση στη main
()
μέθοδο. Η ροή της εκτέλεσης του προγράμματος μεταφέρεται από το try
μπλοκ στο catch
μπλοκ κατά την εξαίρεση. Έτσι, ο υπόλοιπος κώδικας στο try
μπλοκ παραλείπεται και catch
εκτελούνται δηλώσεις στο μπλοκ.