what is nullpointerexception java how avoid it
Αυτό το σεμινάριο θα εξηγήσει τα πάντα για το NullPointerException στην Java. Θα συζητήσουμε τις αιτίες της εξαίρεσης του Null Pointer και τους τρόπους αποφυγής της:
Το NullPointerException στην Java αποτελεί εξαίρεση χρόνου εκτέλεσης. Η Java εκχωρεί μια ειδική τιμή null σε μια αναφορά αντικειμένου. Όταν ένα πρόγραμμα προσπαθεί να χρησιμοποιήσει ένα σύνολο αντικειμένων αναφοράς στην τιμή null, τότε απορρίπτεται αυτή η εξαίρεση.
=> Παρακολουθήστε εδώ την απλή εκπαίδευση Java.
Τι θα μάθετε:
NullPointerException στην Ιάβα
Εάν μια αναφορά αντικειμένου με τιμή null ρίξει το NullPointerException, τότε γιατί χρειαζόμαστε μια τιμή null;
Η τιμή null χρησιμοποιείται συνήθως για να δείξει ότι δεν έχει εκχωρηθεί καμία τιμή σε μια μεταβλητή αναφοράς. Δεύτερον, χρειαζόμαστε μηδενικές τιμές για συλλογές όπως συνδεδεμένες λίστες και δέντρα για να υποδείξουμε μηδενικούς κόμβους. Τα μοτίβα σχεδίασης όπως τα μοτίβα singleton χρησιμοποιούν μηδενικές τιμές.
Συμπερασματικά, η μηδενική τιμή στην Java έχει πολλές χρήσεις. Η εξαίρεση Null Pointer εμφανίζεται σε συγκεκριμένα σενάρια στην Java.
Μερικά από τα σενάρια είναι τα εξής:
- Η μέθοδος επικαλέστηκε χρησιμοποιώντας μηδενικό αντικείμενο.
- Πρόσβαση ή τροποποίηση πεδίου ή μέλους δεδομένων του μηδενικού αντικειμένου.
- Διαβίβαση μηδενικού αντικειμένου ως επιχείρημα σε μια μέθοδο.
- Υπολογισμός του μήκους ενός μηδενικού πίνακα.
- Πρόσβαση στο ευρετήριο ενός μηδενικού πίνακα.
- Συγχρονισμός μηδενικού αντικειμένου.
- Ρίχνει ένα μηδενικό αντικείμενο.
Η εξαίρεση Null Pointer επεκτείνεται από την κατηγορία RuntimeException.
Η ιεραρχία του NullPointerException δίνεται παρακάτω.
Όπως φαίνεται στην παραπάνω ιεραρχία, το Null Pointer Exception επεκτείνεται από το RuntimeException που κληρονομεί την κατηγορία Exception. Η κλάση εξαίρεσης με τη σειρά της προέρχεται από την κατηγορία Throwable που είναι υποκατηγορία αντικειμένου.
Αιτίες της παρουσίας java.lang.NullPointerException
Τώρα θα παρουσιάσουμε καθένα από τα σενάρια εμφάνισης NullPointerException που αναφέραμε παραπάνω.
# 1) Η μέθοδος καλείται χρησιμοποιώντας ένα μηδενικό αντικείμενο
Εξετάστε το ακόλουθο παράδειγμα κώδικα. Εδώ έχουμε μια τάξη, το MyClass που παρέχει δύο μεθόδους. Η πρώτη μέθοδος «initT» επιστρέφει ένα μηδενικό αντικείμενο. Στην κύρια μέθοδο, δημιουργούμε ένα αντικείμενο του MyClass με μια κλήση στη μέθοδο initT.
Στη συνέχεια, καλούμε τη μέθοδο εκτύπωσης του MyClass. Εδώ, το java.lang.NullPointerException ρίχνεται καθώς καλούμε τη μέθοδο εκτύπωσης χρησιμοποιώντας ένα μηδενικό αντικείμενο.
class MyClass { public static MyClass initT() { //method returns a null object return null; } public void print(String s) { System.out.println(s.toLowerCase()); } } class Main{ public static void main(String() args) { MyClass t = MyClass.initT(); //create a new object (null object) t.print('Hello, World!'); //invoke method using null object } }
Παραγωγή
# 2) Πεδίο πρόσβασης ενός μηδενικού αντικειμένου
class MyClass { int numField = 100; public static MyClass initT() { //method returns a null object return null; } public void print(String s) { System.out.println(s.toLowerCase()); } } class Main{ public static void main(String() args) { MyClass t = MyClass.initT(); //create a new object (null object) int num = t.numField; //access MyClass member using null object } }
Παραγωγή
καλύτερη εφαρμογή κατάσκοπων για κινητά για Android
Αυτή είναι μια άλλη αιτία του NullPointerException. Εδώ προσπαθούμε να αποκτήσουμε πρόσβαση σε ένα μέλος της τάξης χρησιμοποιώντας ένα μηδενικό αντικείμενο. Αντιστοιχίζουμε την τιμή επιστροφής της μεθόδου initT στο αντικείμενο t και, στη συνέχεια, έχουμε πρόσβαση στο numField χρησιμοποιώντας το αντικείμενο t. Αλλά το αντικείμενο t είναι ένα μηδενικό αντικείμενο καθώς το initT επιστρέφει ένα μηδενικό αντικείμενο. Σε αυτό το σημείο, εμφανίζεται το java.lang.NullPointerException.
# 3) Διαβίβαση ενός μηδενικού αντικειμένου ως επιχείρημα
Αυτή είναι η κοινή αιτία εμφάνισης του java.lang.NullPointerException. Εξετάστε το ακόλουθο πρόγραμμα Java. Εδώ έχουμε μια μέθοδο «print_LowerCase» που μετατρέπει το αντικείμενο String που μεταβιβάστηκε ως όρισμα σε πεζά.
public class Main { public static void print_LowerCase(String s) { System.out.println(s.toLowerCase()); } public static void main(String() args) { print_LowerCase(null); //pass null object as argument to the method } }
Παραγωγή
Στην κύρια μέθοδο, ονομάζουμε αυτήν τη μέθοδο και περνούμε ένα μηδέν ως επιχείρημα. Καθώς το αντικείμενο συμβολοσειράς δεν μπορεί να είναι μηδενικό, το java.lang.NullPointerException ρίχνεται.
# 4) Λήψη του μήκους ενός μηδενικού πίνακα
Η προσπάθεια υπολογισμού του μήκους μιας μηδενικής συστοιχίας έχει επίσης ως αποτέλεσμα τη ρίψη του java.lang.NullPointerException.
Το παρακάτω πρόγραμμα το αποδεικνύει.
public class Main { public static void main(String() args) { int() dataArray = null; //Array is null; no data System.out.println('Array Length:' + dataArray.length); //print array length } }
Παραγωγή
Στο παραπάνω πρόγραμμα, δηλώνουμε έναν πίνακα και εκχωρούμε μηδέν σε αυτό, δηλαδή δεν υπάρχουν δεδομένα. Όταν χρησιμοποιούμε την ιδιότητα μήκους σε αυτόν τον μηδενικό πίνακα, εμφανίζεται το NullPointerException.
# 5) Ευρετήριο πρόσβασης ενός μηδενικού πίνακα
Παρόμοιο με το μήκος, ακόμη και αν προσπαθήσουμε να αποκτήσουμε πρόσβαση σε μια τιμή σε έναν μηδενικό πίνακα χρησιμοποιώντας ένα ευρετήριο, είναι η αιτία του java.lang.NullPointerException.
public class Main { public static void main(String() args) { int() dataArray = null; //Array set to null //access value at index 2 System.out.println('Value at index 2:' + dataArray(2)); } }
Παραγωγή
Στο παραπάνω πρόγραμμα, προσπαθούμε να αποκτήσουμε πρόσβαση στην τιμή στο ευρετήριο 2 ενός μηδενικού πίνακα.
# 6) Συγχρονισμός σε μηδενικό αντικείμενο
Συνήθως συγχρονίζουμε ένα μπλοκ ή μια μέθοδο για τη διευκόλυνση της ταυτόχρονης πρόσβασης. Ωστόσο, η αναφορά αντικειμένου που χρησιμοποιούμε για συγχρονισμό δεν πρέπει να είναι μηδενική. Εάν είναι μηδενικό αντικείμενο, τότε οδηγεί σε java.lang.NullPointerException.
Το παρακάτω πρόγραμμα Java το αποδεικνύει. Όπως μπορούμε να δούμε, έχουμε ένα αντικείμενο String «mutex» που αρχικοποιήθηκε ως μηδέν. Στη συνέχεια, στην κύρια λειτουργία, χρησιμοποιούμε ένα συγχρονισμένο μπλοκ με το mutex ως αντικείμενο αναφοράς. Καθώς το mutex είναι null java.lang.NullPointerException αυξάνεται.
public class Main { public static String mutex = null; //mutex variable set to null public static void main(String() args) { synchronized(mutex) { //synchronized block for null mutex System.out.println('synchronized block'); } } }
Παραγωγή
# 7) Πετώντας μηδέν
public class Main { public static void main(String() args) { throw null; //throw null } }
Παραγωγή:
Στο παραπάνω παράδειγμα προγράμματος, αντί να ρίχνει ένα έγκυρο αντικείμενο, το null ρίχνεται. Αυτό έχει ως αποτέλεσμα την εξαίρεση Null Pointer.
Αποφυγή εξαίρεσης Null Pointer
Τώρα που έχουμε δει τις αιτίες της εμφάνισης του NullPointerException, πρέπει επίσης να προσπαθήσουμε να το αποφύγουμε στο πρόγραμμά μας.
Πρώτον, πρέπει να διασφαλίσουμε ότι τα αντικείμενα που χρησιμοποιούμε στα προγράμματά μας έχουν αρχικοποιηθεί σωστά, ώστε να αποφύγουμε τη χρήση μηδενικών αντικειμένων που έχουν ως αποτέλεσμα την εξαίρεση του Null Pointer. Πρέπει επίσης να προσέξουμε ότι οι μεταβλητές αναφοράς που χρησιμοποιούνται στο πρόγραμμα επισημαίνονται σε έγκυρες τιμές και δεν αποκτούν κατά λάθος τιμές null.
Εκτός από αυτές τις εκτιμήσεις, μπορούμε επίσης να προσέξουμε κατά περίπτωση για να αποφύγουμε το java.lang.NullPointerException.
Παρακάτω εξετάζουμε μερικές περιπτώσεις.
# 1) Σύγκριση συμβολοσειρών με κυριολεκτικά
Μια σύγκριση μεταξύ της μεταβλητής συμβολοσειράς και ενός κυριολεκτικού (πραγματική τιμή ή στοιχείο του enum) είναι μια πολύ κοινή λειτουργία σε προγράμματα Java. Αλλά εάν η μεταβλητή String που είναι ένα αντικείμενο είναι null, τότε η σύγκριση αυτού του null αντικειμένου με τα κυριολεκτικά θα ρίξει το NullPointerException.
Έτσι, η λύση είναι να επικαλεστεί τη μέθοδο σύγκρισης από την κυριολεκτική αντί του String αντικειμένου που μπορεί να είναι μηδενικό.
Το παρακάτω πρόγραμμα δείχνει πώς μπορούμε να επικαλεστούμε μεθόδους σύγκρισης από τα γράμματα και να αποφύγουμε το java.lang.NullPointerException.
class Main { public static void main (String() args) { // String set to null String myStr = null; // Checking if myStr is null using try catch. try { if ('Hello'.equals(myStr)) //use equals method with literal System.out.print('Two strings are same'); else System.out.print('Strings are not equal'); } catch(NullPointerException e) { System.out.print('Caught NullPointerException'); } } }
Παραγωγή
# 2) Παρακολουθήστε τα επιχειρήματα μιας μεθόδου
Ελέγξτε τα ορίσματα της μεθόδου για να βεβαιωθείτε ότι δεν είναι μηδενικές τιμές. Εάν τα ορίσματα δεν είναι σύμφωνα με την προδιαγραφή, τότε ο κώδικας θα ρίξει το IllegalArgumentException για να δείξει ότι τα ορίσματα δεν είναι όπως αναμενόταν.
Αυτό φαίνεται στο παρακάτω πρόγραμμα Java.
import java.io.*; class Main { public static void main (String() args) { // set String to empty value String myStr = ''; try { System.out.println('String value:' + myStr); System.out.println('String Length:' + getLength(myStr)); } catch(IllegalArgumentException e) { System.out.println('Exception: ' + e.getMessage()); } // Set String to a proper value and call getLength myStr = 'Far from home'; try { System.out.println('String value:' + myStr); System.out.println('String Length:' + getLength(myStr)); } catch(IllegalArgumentException e) { System.out.println('Exception: ' + e.getMessage()); } // Set String to null and call getLength() myStr = null; try { System.out.println('String value:' + myStr); System.out.println('String Length:' + getLength(myStr)); } catch(IllegalArgumentException e) { System.out.println('Exception: ' + e.getMessage()); } } // Method that returns length of the String public static int getLength(String myStr) { if (myStr == null) //throw Exception if String is null throw new IllegalArgumentException('The String argument cannot be null'); return myStr.length(); } }
Παραγωγή
# 3) Χρήση του Ternary Operator για τη φροντίδα των μηδενικών τιμών
Μπορούμε να χρησιμοποιήσουμε τον τριαδικό τελεστή για να αποφύγουμε το java.lang.NullPointerException. Ο τριαδικός χειριστής έχει τρεις χειριστές. Η πρώτη είναι μια δυαδική έκφραση που αξιολογείται ως αληθής ή ψευδής. Εάν η έκφραση είναι αληθής, τότε επιστρέφεται ο δεύτερος τελεστής ή επιστρέφεται ο τρίτος τελεστής.
Το παρακάτω πρόγραμμα δείχνει τη χρήση ενός τριμερούς χειριστή για την αποφυγή του NullPointerException.
import java.io.*; class Main { public static void main (String() args) { // Initialize String with null value String myStr = null; //return a substring for this String using ternary oprator String myVal = (myStr == null) ? '' : myStr.substring(0,5); if(myVal.equals('')) System.out.println('Empty String!!'); else System.out.println('String value: ' + myVal); // Now set a value for String myStr = 'SoftwareTestingHelp'; //return a substring for this String using ternary oprator myVal = (myStr == null) ? '' : myStr.substring(0,8); if(myVal.equals('')) System.out.println('Empty String!!'); else System.out.println('String value: ' + myVal); }
Παραγωγή
Συχνές Ερωτήσεις
Ε # 1) Πώς μπορώ να διορθώσω το NullPointerException στην Java;
Απάντηση: Πρέπει να διασφαλίσουμε ότι όλα τα αντικείμενα που χρησιμοποιούνται στο πρόγραμμα αρχικοποιούνται σωστά και δεν έχουν μηδενικές τιμές. Επίσης, οι μεταβλητές αναφοράς δεν πρέπει να έχουν μηδενικές τιμές.
# 2) Έχει ελεγχθεί ή δεν είναι επιλεγμένο το NullPointerException;
Απάντηση: Το NullPointerException δεν αποτελεί εξαίρεση. Είναι απόγονος του RuntimeException και δεν έχει επιλεγεί.
# 3) Πώς μπορώ να σταματήσω το NullPointerException;
Απάντηση: Μερικές από τις βέλτιστες πρακτικές για την αποφυγή του NullPointerException είναι:
- Χρησιμοποιήστε τη μέθοδο Equals () και EqualsIgnoreCase () με String literal αντί να τη χρησιμοποιήσετε στο άγνωστο αντικείμενο που μπορεί να είναι μηδενικό.
- Χρησιμοποιήστε το valueOf () αντί για toString (); και και οι δύο επιστρέφουν το ίδιο αποτέλεσμα.
- Χρησιμοποιήστε τον σχολιασμό Java @NotNull και @Nullable.
# 4) Ποια είναι η μηδενική τιμή στην Java;
Απάντηση: Η τιμή null δεν αναφέρεται σε κανένα αντικείμενο ή μεταβλητή. Είναι μια λέξη-κλειδί και μια κυριολεκτική. Αντιπροσωπεύει μια μηδενική αναφορά.
# 5) Μπορούμε να πιάσουμε το NullPointerException στην Java;
Απάντηση: Η εξαίρεση java.lang.NullPointerException είναι μια ανεξέλεγκτη εξαίρεση και επεκτείνει την κλάση RuntimeException. Ως εκ τούτου, δεν υπάρχει εξαναγκασμός για τον προγραμματιστή να το πιάσει.
συμπέρασμα
Σε αυτό το σεμινάριο, έχουμε συζητήσει το NullPointerException στην Java. Αυτή είναι μια αρκετά επικίνδυνη εξαίρεση και συνήθως εμφανίζεται όταν το περιμένουμε. Η εξαίρεση Null Pointer εμφανίζεται κυρίως λόγω του μηδενικού αντικειμένου ή της μηδενικής αναφοράς. Έχουμε ήδη δει τις αιτίες και τους τρόπους αποφυγής του NullPointerException.
Στο μέτρο του δυνατού, ο προγραμματιστής πρέπει να προσπαθήσει να αποφύγει την εμφάνιση της εξαίρεσης Null Pointer σε ένα πρόγραμμα. Δεδομένου ότι πρόκειται για μια μη ελεγχόμενη εξαίρεση χρόνου εκτέλεσης, θα πρέπει να δούμε ότι δεν συμβαίνει όταν εκτελείται η εφαρμογή.
=> Επισκεφθείτε εδώ για να μάθετε Java από το μηδέν.
Συνιστώμενη ανάγνωση
- Εξαιρέσεις Java και χειρισμός εξαιρέσεων με παραδείγματα
- Πώς να χειριστείτε το ArrayIndexOutOfBoundsException στην Java;
- C # Εκπαιδευτικός χειρισμός εξαίρεσης με παραδείγματα κώδικα
- Πλήρης οδηγός για την εξαίρεση PL SQL με παραδείγματα
- Πώς να χειριστείτε την εξαίρεση σε δέσμες ενεργειών SoapUI Groovy - SoapUI Tutorial # 11
- Python Try Except - Εξαίρεση χειρισμού Python με παραδείγματα
- Χειρισμός εξαιρέσεων JDBC - Τρόπος χειρισμού εξαιρέσεων SQL
- Εξαίρεση χειρισμός σε C ++