Χειρισμός εξαιρέσεων σε Java με παραδείγματα |  2023

Χειρισμός εξαιρέσεων σε Java με παραδείγματα | 2023

November 25, 2022 0 Von admin

Ο χειρισμός εξαιρέσεων στη Java είναι ένας από τους ισχυρούς μηχανισμούς για τη διαχείριση σφαλμάτων χρόνου εκτέλεσης που προκαλούνται από εξαιρέσεις. Ο χειρισμός εξαιρέσεων παίζει σημαντικό ρόλο στην ανάπτυξη λογισμικού. Αυτό το άρθρο σάς βοηθά να κατανοήσετε την εξαίρεση java, την εξαίρεση στην java, τον χειρισμό εξαιρέσεων java, την ιεραρχία εξαιρέσεων java, τους τύπους εξαιρέσεων στη java και πολλά άλλα.

Τι είναι ο χειρισμός εξαιρέσεων στην Java;

Ο χειρισμός εξαιρέσεων στη Java βοηθά στην ελαχιστοποίηση των εξαιρέσεων και βοηθά στην ανάκτηση από εξαιρέσεις. Είναι ένας από τους ισχυρούς μηχανισμούς χειρισμού εξαιρέσεων χρόνου εκτέλεσης και τον καθιστά χωρίς σφάλματα. Ο χειρισμός εξαιρέσεων βοηθά στη διατήρηση της ροής του προγράμματος. Ο χειρισμός εξαίρεσης ορίζεται ως μια μη φυσιολογική κατάσταση που μπορεί να συμβεί κατά το χρόνο εκτέλεσης και να διαταράξει την κανονική ροή του προγράμματος.

Διαβάστε επίσης: Java Tutorial για αρχάριους

Τι είναι η Εξαίρεση;

Μια προσδοκία είναι ένα απροσδόκητο γεγονός που συμβαίνει κατά την εκτέλεση του προγράμματος, το οποίο διαταράσσει την κανονική ροή του κώδικα.

Χειρισμός εξαιρέσεων σε java με ένα παράδειγμα:

Ας πούμε,

statement
statement
statement
exception ………… an exception occurred, then JVM will handle it and will exit the prog.
statement
statement
statement

Για χειρισμό εξαιρέσεων, υπάρχουν 2 πιθανές προσεγγίσεις

1. JVM

Εάν μια εξαίρεση δεν αντιμετωπίζεται ρητά, τότε η JVM αναλαμβάνει την ευθύνη χειρισμού της εξαίρεσης.

Μόλις αντιμετωπιστεί η εξαίρεση, το JVM θα σταματήσει το πρόγραμμα και δεν θα πραγματοποιηθεί άλλη εκτέλεση κώδικα

import java.util.*;

class Main {
    public static void main (String[] args) {
        System.out.println(5/0);
        System.out.println("End of program!");
	}
}

Σφάλμα χρόνου εκτέλεσης:

 Exception in thread "main" java.lang.ArithmeticException: / by zero
 at Main.main(File.java:5) 

2. Προγραμματιστής

Οι προγραμματιστές μπορούν να γράψουν ρητά την υλοποίηση για τον χειρισμό της εξαίρεσης. Μόλις γίνει ο χειρισμός μιας εξαίρεσης, η κανονική εκτέλεση του κώδικα θα συνεχιστεί.

Προτιμότερος: χειριστείτε τις εξαιρέσεις για να διασφαλίσετε ότι ο κώδικάς σας εκτελείται κανονικά.

Ιεραρχία εξαίρεσης Java

Ιεραρχία Εξαίρεσης – Ακολουθεί η ιεραρχία χειρισμού Exception Handling σε Java.

  • Πετάσιμο
    • Είναι η κλάση ρίζας για την ιεραρχία εξαιρέσεων στη java.
    • Είναι στο πακέτο java.lang.
  • Λάθος
    • Υποκατηγορία Throwable.
    • Αποτελείται από μη φυσιολογική κατάσταση που είναι εκτός ελέγχου και εξαρτάται από το περιβάλλον
    • Δεν μπορούν να αντιμετωπιστούν και πάντα θα έχουν ως αποτέλεσμα τη διακοπή του προγράμματος.
    • Π.χ.: StackOverFlowError που μπορεί να συμβεί σε άπειρο βρόχο ή αναδρομή
  • Εξαίρεση
    • Υποκατηγορία Throwable.
    • Αποτελείται από μη φυσιολογικές συνθήκες που μπορούν να αντιμετωπιστούν ρητά.
    • Εάν κάποιος χειριστεί την εξαίρεση, τότε ο κώδικάς μας θα συνεχίσει να εκτελείται ομαλά.

Τύποι εξαιρέσεων σε Java

  • Επιλεγμένες Εξαιρέσεις
    • Αυτές οι εξαιρέσεις που ελέγχονται κατά το χρόνο μεταγλώττισης περιλαμβάνουν ελεγμένες εξαιρέσεις.
    • Είναι θυγατρικές κατηγορίες Exception εκτός από το RuntimeException.
    • Το πρόγραμμα δεν θα μεταγλωττιστεί εάν δεν χειριστούν.
    • Παράδειγμα: IOException, ClassNotFoundException, κ.λπ.
  • Μη επιλεγμένες Εξαιρέσεις
    • Αυτές οι εξαιρέσεις που ελέγχονται κατά το χρόνο εκτέλεσης περιλαμβάνουν μη επιλεγμένες εξαιρέσεις.
    • Είναι θυγατρικές κατηγορίες του RuntimeException.
    • Δίνουν σφάλματα χρόνου εκτέλεσης εάν δεν αντιμετωπίζονται ρητά.
    • Παράδειγμα: ArithmeticException, NullPointerException κ.λπ.

Διαφορά μεταξύ επιλεγμένης και μη επιλεγμένης εξαίρεσης

Επιλεγμένες Εξαιρέσεις Μη επιλεγμένες Εξαιρέσεις
Εμφανίζονται κατά το χρόνο μεταγλώττισης. Εμφανίζονται κατά το χρόνο εκτέλεσης.
Ο μεταγλωττιστής ελέγχει για μια επιλεγμένη εξαίρεση. Ο μεταγλωττιστής δεν ελέγχει για εξαιρέσεις.
Μπορεί να αντιμετωπιστεί κατά το χρόνο της μεταγλώττισης. Δεν είναι δυνατή η σύλληψη ή ο χειρισμός κατά τη διάρκεια του χρόνου μεταγλώττισης.
Το JVM απαιτεί την σύλληψη και τον χειρισμό της εξαίρεσης. Το JVM δεν απαιτεί την σύλληψη και τον χειρισμό της εξαίρεσης.
Παράδειγμα επιλεγμένης εξαίρεσης- „Το αρχείο δεν βρέθηκε εξαίρεση“ Παράδειγμα μη ελεγμένων εξαιρέσεων- „Δεν υπάρχει τέτοια εξαίρεση στοιχείου“

Δείκτης εξαίρεσης Java

Λέξεις-κλειδιά εξαίρεσης Java

Εξαίρεση Η διαχείριση του χειρισμού στη java γίνεται μέσω πέντε λέξεων-κλειδιών: προσπαθώ, πιάνω, ρίχνω, πετάω και τέλος. Ακολουθούν 5 λέξεις-κλειδιά που χρησιμοποιούνται για τον χειρισμό εξαιρέσεων στην Java

Λέξη-κλειδί Περιγραφή
προσπαθήστε Αυτή η λέξη-κλειδί χρησιμοποιείται για τον καθορισμό ενός μπλοκ και αυτό το μπλοκ πρέπει να ακολουθείται είτε από catch είτε τελικά. Δηλαδή, δεν μπορούμε να χρησιμοποιήσουμε μόνο το try block.
σύλληψη Αυτή η λέξη-κλειδί πρέπει να προηγείται από ένα μπλοκ δοκιμής για να χειριστεί την εξαίρεση και μπορεί να ακολουθηθεί από ένα τελικό μπλοκ αργότερα.
τελικά Αυτή η λέξη-κλειδί χρησιμοποιείται για την εκτέλεση του προγράμματος, είτε αντιμετωπίζεται μια εξαίρεση είτε όχι.
βολή Αυτή η λέξη-κλειδί χρησιμοποιείται για τη δημιουργία εξαίρεσης.
ρίχνει Αυτή η λέξη-κλειδί χρησιμοποιείται για τη δήλωση εξαιρέσεων.

Java Try-Catch Block

Σύνταξη δοκιμασίας:

try{
}
catch(Exception e){
}
public class ExceptionDemo {
	public static void main (String[] args) {
		int a=10;
		for(int i=3;i>=0;i--)
		   try{
		     System.out.println(a/i);  
		   }catch(ArithmeticException e){
		       System.out.println(e);
		   }
	}
}

Παραγωγή:

3
5
10
java.lang.ArithmeticException: / by zero 
  • προσπαθήστε Το μπλοκ περιέχει τον κώδικα που μπορεί να δημιουργήσει μια εξαίρεση. Μην γράψετε τίποτα επιπλέον στην προσπάθεια, καθώς οι δηλώσεις μετά την εξαίρεση δεν θα εκτελεστούν εάν προέκυψε η εξαίρεση. Η δοκιμή πρέπει να ακολουθείται αμέσως από catch ή τελικά block.
public class ExceptionDemo {
	public static void main (String[] args) {
		int a=10;
		for(int i=3;i>=0;i--)
		   try{
		     System.out.println(a/i);  
		   }
	}
}

Σφάλμα μεταγλώττισης χρόνου:

prog.java:5: error: 'try' without 'catch', 'finally' or resource declarations
    try{
    ^
1 error 
  • Το μπλοκ catch χρησιμοποιείται για να συλλάβει την εξαίρεση που δημιουργείται από δηλώσεις στο μπλοκ try. Το catch πρέπει να ακολουθήσει δοκιμάστε διαφορετικά θα δώσει ένα σφάλμα χρόνου μεταγλώττισης.
public class ExceptionDemo {
	public static void main (String[] args) {
		int a=10;
		for(int i=3;i>=0;i--)
		   try{
		     System.out.println(a/i);  
		   }
		   System.out.println("between try and catch");
		   catch(ArithmeticException e){
		       System.out.println(e);
		   }
	}
}

Σφάλμα χρόνου μεταγλώττισης:

prog.java:5: error: 'try' without 'catch', 'finally' or resource declarations
    try{
    ^
prog.java:9: error: 'catch' without 'try'
    catch(ArithmeticException e){
    ^
2 errors 

Πράγματα που πρέπει να θυμάστε:

Μην κρατάτε κανένα κωδικό μετά τη δήλωση που είναι επιρρεπής σε εξαίρεση. Επειδή, εάν προκύψει μια εξαίρεση, θα μεταπηδήσει αμέσως στο catch ή τελικά θα μπλοκάρει, αγνοώντας όλες τις άλλες δηλώσεις στο μπλοκ try.

class Main {
	public static void main (String[] args) {
         try
       {
             System.out.println(4/0);
	 //will not get printed
             System.out.println("end of try!");
        }
catch(ArithmeticException e)
        {
            System.out.println("divide by 0");
        }
    }
}

Παραγωγή:

divide by 0
  • Ενώ συλλαμβάνετε την εξαίρεση στο μπλοκ catch, μπορείτε είτε να έχετε απευθείας την κλάση της εξαίρεσης είτε την υπερκλάση της.

Παράδειγμα: Ακριβής εξαίρεση

class Main {
	public static void main (String[] args) {
        try{
            System.out.println(4/0);
           }
      
        //ArithmeticException 
        catch(ArithmeticException e){
            System.out.println("divide by 0");
        }
    }
}

Παραγωγή:

divide by 0

Παράδειγμα: Υπερκλάση Ακριβούς Εξαίρεσης

class Main {
	public static void main (String[] args) {
        try{
            System.out.println(4/0);
           }
      
        //superclass of ArithmeticException 
        catch(Exception e){
            System.out.println("divide by 0");
        }
     }
}

Παραγωγή:

divide by 0

Java Multiple Catch Block

Εάν έχετε πολλά αλιεύματα, πρέπει να διατηρήσετε την ιεραρχία από υποκλάση σε υπερκλάση.

Ανακριβής:

class Main {
	public static void main (String[] args) {
        try{
            System.out.println(4/0);
        }catch(Exception e)
        {
            System.out.println("Exception : divide by 0");
        }catch(ArithmeticException e)
        {
            System.out.println("ArithmeticException :divide by 0");
        }
	}
}

Σφάλμα μεταγλώττισης χρόνου:

 prog.java:11: error: exception ArithmeticException has already been caught
        }catch(ArithmeticException e)
         ^
1 error 

Σωστός:

class Main {
	public static void main (String[] args) {
        try{
            System.out.println(4/0);
        }catch(ArithmeticException e)
        {
            System.out.println("ArithmeticException : divide by 0");
        }catch(Exception e)
        {
            System.out.println("Exception : divide by 0");
        }
   }
}

Παραγωγή:

ArithmeticException: Divide by 0

Java Nested Δοκιμάστε

Όταν υπάρχει άλλο μπλοκ δοκιμής μέσα στο μπλοκ δοκιμής:

class Main {
	public static void main (String[] args) {
        try{
                try{
                    int[] a={1,2,3};
                    System.out.println(a[3]);
                }
   catch(ArrayIndexOutOfBoundsException e)
                {
                    System.out.println("Out of bounds");
                }
              System.out.println(4/0);
        }
       catch(ArithmeticException e)
        {
            System.out.println("ArithmeticException : divide by 0");
        }
	}
    }

Παραγωγή:

Out of bounds
ArithmeticException: Divide by 0 

Σημείωση – Εάν βάλουμε τον κωδικό της εξωτερικής δοκιμής πριν από την εσωτερική προσπάθεια, τότε εάν προκύψει εξαίρεση, θα αγνοήσει ολόκληρη την εσωτερική προσπάθεια και θα μετακινηθεί απευθείας στο μπλοκ αλίευσης.

class Main {
	public static void main (String[] args) {
        try{
               System.out.println(4/0);
               try{
                    int[] a={1,2,3};
                    System.out.println(a[3]);
                }
   catch(ArrayIndexOutOfBoundsException e)
                {
                    System.out.println("Out of bounds");
                }
        }
       catch(ArithmeticException e)
        {
            System.out.println("ArithmeticException : divide by 0");
        }
	}
    }

Παραγωγή:

ArithmeticException: Divide by 0

Java τελικά Block

Περιέχει κώδικα που πρέπει να εκτελεστεί ανεξάρτητα από το αν υπάρχει εξαίρεση ή όχι. Περιέχει κώδικα απελευθέρωσης αρχείου, συνδέσεων κλεισίματος κ.λπ.

class Main {
	public static void main (String[] args) {
        try{
            System.out.println(4/0);
        }catch(Exception e)
        {
            System.out.println(e);       
        }
        finally
        {
            System.out.println("finally executed");
        }
        
       	        System.out.println("end");
	}
}

Παραγωγή:

java.lang.ArithmeticException: / by zero
finally executed
end 

Τέλος, θα εκτελεστεί ακόμα και όταν δεν χειριζόμαστε εξαιρέσεις. Πριν διακόψει το πρόγραμμα, το JVM ελέγχει αν υπάρχει «επιτέλους» μπλοκ.

class Main {
	public static void main (String[] args) {
        try{
            System.out.println(4/0);
            
        }finally
        {
            System.out.println("cleaning.......");
        }
	}
}

Σφάλμα χρόνου εκτέλεσης:

 Exception in thread "main" java.lang.ArithmeticException: / by zero
 at Main.main(File.java:4) 

Παραγωγή:

cleaning.......

Java Final vs Τέλος vs Finalize

Τελικός Τελικά Οριστικοποιώ
Το Final χρησιμοποιείται για την εφαρμογή περιορισμών στην κλάση, τη μέθοδο και τη μεταβλητή Τέλος χρησιμοποιείται στην κωδικοποίηση, θα εκτελεστεί είτε χειριστεί μια εξαίρεση είτε όχι. Το Finalize χρησιμοποιείται για την εκτέλεση επεξεργασίας καθαρισμού πριν από τη συλλογή των σκουπιδιών.
Το Final είναι μια λέξη-κλειδί στη java Τέλος είναι ένα μπλοκ στη java Το Finalize είναι μια μέθοδος στη java
Το τελικό εκτελείται κατόπιν κλήσης του. Τελικά εκτελείται μετά το μπλοκ „try-catch“. οριστικοποίηση εκτελεί ακριβώς πριν από την καταστροφή του αντικειμένου.

Λέξη-κλειδί Java Throw

Είναι μια λέξη-κλειδί που χρησιμοποιείται για τη ρητή εξαίρεση.

Μπορούμε να χρησιμοποιήσουμε τη ρίψη όπου σύμφωνα με τη λογική μας θα πρέπει να υπάρχει μια εξαίρεση.

Παράδειγμα:

public class ExceptionDemo {
	static void canVote(int age){
		if(age<18)
            try{
                throw new Exception();
            }catch(Exception e){
                System.out.println("you are not an adult!");
            }
		else
		   System.out.println("you can vote!");
	}
	public static void main (String[] args) {
		canVote(20);
		canVote(10);
	}
}

Παραγωγή:

you can vote!
you are not an adult! 

Java Throws Λέξη-κλειδί

  • Η λέξη-κλειδί Throws χρησιμοποιείται όταν ο καλούμενος δεν θέλει να χειριστεί την εξαίρεση, αλλά θέλει να επεκτείνει αυτήν την ευθύνη χειρισμού της εξαίρεσης στον καλούντα της συνάρτησης.
  • Βασικά λέει τι είδους εξαίρεση μπορεί να δημιουργήσει ο κωδικός και βασίζεται στον καλούντα για να τον χειριστεί.
  • Χρησιμοποιείται για το χειρισμό των επιλεγμένων εξαιρέσεων, καθώς ο μεταγλωττιστής δεν θα επιτρέψει τη μεταγλώττιση κώδικα έως ότου γίνει ο χειρισμός τους.

Παράδειγμα:

public class ExceptionDemo {
	static void func(int a) throws Exception{
		   System.out.println(10/a);  
	}
	public static void main (String[] args) {
		try{
		    func(10);
		    func(0);
		}catch(Exception e){
		   System.out.println("can't divide by zero");
		}
	
	}
}

Παραγωγή:

1
can't divide by zero 

Εάν ο καλούμενος μπορεί να ρίξει πολλές εξαιρέσεις, τότε όλες θα πεταχτούν ταυτόχρονα.

import java.util.*;

public class ExceptionDemo {
	static void func(int a,int b) throws ArithmeticException, ArrayIndexOutOfBoundsException{
		   System.out.println(10/a); 
		   int[] arr={1,2,3};
		   System.out.println(arr[b]);
	}
	public static void main (String[] args) {
		Scanner in=new Scanner(System.in);
		for(int i=0;i<3;i++){
		try{
		    func(in.nextInt(),in.nextInt());
    		}catch(ArithmeticException e){
    		   System.out.println("can't divide by zero");
    		}catch(ArrayIndexOutOfBoundsException e){
    		   System.out.println("Out of bounds!");
    		}
		     }
		
	}
   }

Εισαγωγή:

2 1
0 1
2 3 

Παραγωγή:

5
2
can't divide by zero
5
Out of bounds! 

Java Throw vs Throws

Βολή Ρίψεις
Αυτή η λέξη-κλειδί χρησιμοποιείται για τη ρητή δημιουργία εξαίρεσης. Αυτή η λέξη-κλειδί χρησιμοποιείται για τη δήλωση εξαίρεσης.
Μια επιλεγμένη εξαίρεση δεν μπορεί να διαδοθεί μόνο με ρίψη. Μια επιλεγμένη εξαίρεση μπορεί να διαδοθεί με ρίψεις.
Η ρίψη ακολουθείται από ένα παράδειγμα και χρησιμοποιείται με μια μέθοδο Οι ρίψεις ακολουθούνται από την κλάση και χρησιμοποιούνται με την υπογραφή της μεθόδου.
Δεν μπορείτε να κάνετε πολλές εξαιρέσεις. Μπορείτε να δηλώσετε πολλές εξαιρέσεις

Προσαρμοσμένη εξαίρεση Java

Μπορείτε να δημιουργήσετε τη δική σας εξαίρεση και να δώσετε εφαρμογή ως προς το πώς πρέπει να συμπεριφέρεται. Η εξαίρεση σας θα συμπεριφέρεται σαν μια παιδική τάξη Εξαίρεσης.

Σύνταξη:

 class YourException extends Exception{}
  • Παράδειγμα:
    • ας πούμε ότι συνεργάζεστε με μια αεροπορική εταιρεία
    • Βρίσκεστε στο τμήμα check-in αποσκευών και σύμφωνα με τους κανόνες, μπορείτε να επιτρέψετε 15 κιλά ανά πελάτη.
    • Οπότε τώρα περισσότερα από 15 κιλά είναι μια μη φυσιολογική κατάσταση για εμάς ή με άλλα λόγια αποτελεί εξαίρεση
    • Αυτή είναι η εξαίρεση που βασίζεται στη λογική, επομένως θα δημιουργήσουμε την προσαρμοσμένη εξαίρεση WeightLimitExceeded
    • Σύμφωνα με τη σύνταξη, θα επεκτείνει την Εξαίρεση.
    • Ορίζουμε τον κατασκευαστή που θα κληθεί μόλις γίνει εξαίρεση
    • Πρέπει να βάλουμε ρητά την εξαίρεση και ως εκ τούτου θα χρησιμοποιήσουμε τη λέξη-κλειδί ρίχνω για αυτό.
    • Η χρήση της λέξης-κλειδιού ρίχνει είναι σύμφωνα με τις ανάγκες μας. Εάν χειριζόμαστε μια εξαίρεση όπου εκτοξεύεται, τότε μπορούμε να αποφύγουμε τις ρίψεις, διαφορετικά θα χρησιμοποιήσουμε ρίψεις και θα τις χειριστούμε στον καλούντα.

Εκτέλεση:

import java.util.*;

class WeightLimitExceeded extends Exception{
    WeightLimitExceeded(int x){
        System.out.print(Math.abs(15-x)+" kg : ");
    }
}


class Main {
    void validWeight(int weight) throws WeightLimitExceeded{
        if(weight>15)
            throw new WeightLimitExceeded(weight);
        else
            System.out.println("You are ready to fly!");
    }
    
      public static void main (String[] args) {
        Main ob=new Main();
        Scanner in=new Scanner(System.in);
        for(int i=0;i<2;i++){
            try{
                ob.validWeight(in.nextInt());
            }catch(WeightLimitExceeded e){
                System.out.println(e);
            }
        }
        
	}
}

Εισαγωγή:

20
7 

Παραγωγή:

5 kg : WeightLimitExceeded
You are ready to fly! 

Εξαίρεση Χειρισμός σε java με παράκαμψη μεθόδου

Ο χειρισμός εξαιρέσεων σε Java με παράκαμψη μεθόδου είναι ένα παρακάμπτεται μέθοδος που δηλώνει ότι δημιουργεί μια εξαίρεση και δηλώνει ότι μπορεί να δημιουργήσει την ίδια εξαίρεση ή υποτύπο αυτής της εξαίρεσης.

Για να χειριστείτε την εξαίρεση στην Java, θα πρέπει να ακολουθήσετε τρεις σημαντικούς κανόνες. Φαίνονται στο παρακάτω σχήμα.

χειρισμός εξαιρέσεων σε java
Χειρισμός εξαιρέσεων σε Java με παράκαμψη μεθόδου

Πλεονεκτήματα και μειονεκτήματα του χειρισμού εξαιρέσεων στη java

Πλεονεκτήματα της εξαίρεσης χειρισμού σε java

  • Διαχωρισμός του Κώδικα χειρισμού σφαλμάτων από τον «κανονικό» κώδικα
  • Διάδοση σφαλμάτων στη στοίβα κλήσεων
  • Ομαδοποίηση και διαφοροποίηση τύπων σφαλμάτων

Μειονεκτήματα της εξαίρεσης χειρισμού σε java

  • Βιώνοντας περιττά έξοδα
  • Δεν καταλαβαίνω πώς λειτουργεί πραγματικά η εφαρμογή
  • Γεμίζοντας τα αρχεία καταγραφής σας με θορυβώδη συμβάντα
  • Αδυναμία εστίασης σε αυτό που πραγματικά έχει σημασία

Αυτό μας φέρνει στο τέλος αυτού του άρθρου σχετικά με τον χειρισμό εξαιρέσεων στη java. Ελπίζουμε ότι είστε πλέον σαφείς σχετικά με την έννοια του χειρισμού εξαιρέσεων στη java. Εάν θέλετε να μάθετε περισσότερα για τη γλώσσα προγραμματισμού java, τότε συνδεθείτε στο δωρεάν διαδικτυακό μας μάθημα java με πιστοποιητικό και δύναμη μπροστά στην καριέρα σας.

Δείτε επίσης: