Τι είναι οι εξαιρέσεις μηδενικού δείκτη (java.lang.NullPointerException
) και τι τις προκαλεί;
Ποιες μέθοδοι/εργαλεία μπορούν να χρησιμοποιηθούν για τον προσδιορισμό της αιτίας ώστε να σταματήσετε την εξαίρεση από το να προκαλέσει τον πρόωρο τερματισμό του προγράμματος;
Οι NullPointerException
είναι εξαιρέσεις που εμφανίζονται όταν προσπαθείτε να χρησιμοποιήσετε μια αναφορά που δεν δείχνει σε καμία θέση στη μνήμη (null) σαν να αναφέρεται σε ένα αντικείμενο. Η κλήση μιας μεθόδου σε μια μηδενική αναφορά ή η προσπάθεια πρόσβασης σε ένα πεδίο μιας μηδενικής αναφοράς θα προκαλέσει μια NullPointerException
. Αυτοί είναι οι πιο συνηθισμένοι, αλλά άλλοι τρόποι παρατίθενται στη σελίδα NullPointerException
javadoc.
Πιθανότατα το πιο γρήγορο παράδειγμα κώδικα που θα μπορούσα να σκεφτώ για να απεικονίσω μια NullPointerException
θα ήταν:
public class Example {
public static void main(String[] args) {
Object obj = null;
obj.hashCode();
}
}
Στην πρώτη γραμμή μέσα στο main
, ορίζω ρητά την αναφορά του Object
obj
ίση με null
. Αυτό σημαίνει ότι έχω μια αναφορά, αλλά δεν δείχνει σε κάποιο αντικείμενο. Μετά από αυτό, προσπαθώ να μεταχειριστώ την αναφορά σαν να δείχνει σε ένα αντικείμενο καλώντας μια μέθοδο σε αυτήν. Αυτό έχει ως αποτέλεσμα μια NullPointerException
επειδή δεν υπάρχει κώδικας προς εκτέλεση στη θέση που δείχνει η αναφορά.
(Αυτό είναι μια τεχνική λεπτομέρεια, αλλά νομίζω ότι πρέπει να αναφερθεί: Μια αναφορά που δείχνει στο null δεν είναι το ίδιο με έναν δείκτη της C που δείχνει σε μια άκυρη θέση μνήμης. Ένας null δείκτης κυριολεκτικά δεν δείχνει πουθενά, το οποίο είναι ελαφρώς διαφορετικό από το να δείχνει σε μια θέση που τυχαίνει να είναι άκυρη).
Είναι σαν να προσπαθείτε να αποκτήσετε πρόσβαση σε ένα αντικείμενο που είναι "μηδενικό". Σκεφτείτε το παρακάτω παράδειγμα:
TypeA objA;
Αυτή τη στιγμή έχετε μόλις δηλώσει αυτό το αντικείμενο, αλλά δεν το έχετε αρχικοποιήσει ή ενσαρκώσει. Και κάθε φορά που προσπαθείτε να προσπελάσετε κάποια ιδιότητα ή μέθοδο σε αυτό, θα πετάει NullPointerException
το οποίο είναι λογικό.
Δείτε επίσης το παρακάτω παράδειγμα:
String a = null;
System.out.println(a.toString()); // NullPointerException will be thrown
Ένας δείκτης null
είναι ένας δείκτης που δεν δείχνει πουθενά. Όταν αποαναφέρετε έναν δείκτη p
, λέτε "δώσε μου τα δεδομένα στη θέση που είναι αποθηκευμένα στο "p". Όταν ο p
είναι ένας δείκτης null
, η θέση που είναι αποθηκευμένη στον p
είναι πουθενά
, λέτε "δώσε μου τα δεδομένα στη θέση 'πουθενά'". Προφανώς, δεν μπορεί να το κάνει αυτό, οπότε πετάει μια εξαίρεση null pointer exception
.
Γενικά, αυτό συμβαίνει επειδή κάτι δεν έχει αρχικοποιηθεί σωστά.