Περισσότερα
Τι είναι η NullPointerException και πώς μπορώ να τη διορθώσω;
Τι είναι οι εξαιρέσεις μηδενικού δείκτη (java.lang.NullPointerException
) και τι τις προκαλεί;
Ποιες μέθοδοι/εργαλεία μπορούν να χρησιμοποιηθούν για τον προσδιορισμό της αιτίας ώστε να σταματήσετε την εξαίρεση από το να προκαλέσει τον πρόωρο τερματισμό του προγράμματος;
210
3
Οι
NullPointerException
είναι εξαιρέσεις που εμφανίζονται όταν προσπαθείτε να χρησιμοποιήσετε μια αναφορά που δεν δείχνει σε καμία θέση στη μνήμη (null) σαν να αναφέρεται σε ένα αντικείμενο. Η κλήση μιας μεθόδου σε μια μηδενική αναφορά ή η προσπάθεια πρόσβασης σε ένα πεδίο μιας μηδενικής αναφοράς θα προκαλέσει μιαNullPointerException
. Αυτοί είναι οι πιο συνηθισμένοι, αλλά άλλοι τρόποι παρατίθενται στη σελίδαNullPointerException
javadoc.Πιθανότατα το πιο γρήγορο παράδειγμα κώδικα που θα μπορούσα να σκεφτώ για να απεικονίσω μια
NullPointerException
θα ήταν:Στην πρώτη γραμμή μέσα στο
main
, ορίζω ρητά την αναφορά τουObject
obj
ίση μεnull
. Αυτό σημαίνει ότι έχω μια αναφορά, αλλά δεν δείχνει σε κάποιο αντικείμενο. Μετά από αυτό, προσπαθώ να μεταχειριστώ την αναφορά σαν να δείχνει σε ένα αντικείμενο καλώντας μια μέθοδο σε αυτήν. Αυτό έχει ως αποτέλεσμα μιαNullPointerException
επειδή δεν υπάρχει κώδικας προς εκτέλεση στη θέση που δείχνει η αναφορά.(Αυτό είναι μια τεχνική λεπτομέρεια, αλλά νομίζω ότι πρέπει να αναφερθεί: Μια αναφορά που δείχνει στο null δεν είναι το ίδιο με έναν δείκτη της C που δείχνει σε μια άκυρη θέση μνήμης. Ένας null δείκτης κυριολεκτικά δεν δείχνει πουθενά, το οποίο είναι ελαφρώς διαφορετικό από το να δείχνει σε μια θέση που τυχαίνει να είναι άκυρη).
Είναι σαν να προσπαθείτε να αποκτήσετε πρόσβαση σε ένα αντικείμενο που είναι "μηδενικό". Σκεφτείτε το παρακάτω παράδειγμα:
Αυτή τη στιγμή έχετε μόλις δηλώσει αυτό το αντικείμενο, αλλά δεν το έχετε αρχικοποιήσει ή ενσαρκώσει. Και κάθε φορά που προσπαθείτε να προσπελάσετε κάποια ιδιότητα ή μέθοδο σε αυτό, θα πετάει
NullPointerException
το οποίο είναι λογικό.Δείτε επίσης το παρακάτω παράδειγμα:
Ένας δείκτης
null
είναι ένας δείκτης που δεν δείχνει πουθενά. Όταν αποαναφέρετε έναν δείκτηp
, λέτε "δώσε μου τα δεδομένα στη θέση που είναι αποθηκευμένα στο "p". Όταν οp
είναι ένας δείκτηςnull
, η θέση που είναι αποθηκευμένη στονp
είναιπουθενά
, λέτε "δώσε μου τα δεδομένα στη θέση 'πουθενά'". Προφανώς, δεν μπορεί να το κάνει αυτό, οπότε πετάει μια εξαίρεσηnull pointer exception
.Γενικά, αυτό συμβαίνει επειδή κάτι δεν έχει αρχικοποιηθεί σωστά.