Τι είναι η NullPointerException και πώς μπορώ να τη διορθώσω;

Τι είναι οι εξαιρέσεις μηδενικού δείκτη (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 δείκτης κυριολεκτικά δεν δείχνει πουθενά, το οποίο είναι ελαφρώς διαφορετικό από το να δείχνει σε μια θέση που τυχαίνει να είναι άκυρη).

Σχόλια (15)

Είναι σαν να προσπαθείτε να αποκτήσετε πρόσβαση σε ένα αντικείμενο που είναι "μηδενικό". Σκεφτείτε το παρακάτω παράδειγμα:

TypeA objA;

Αυτή τη στιγμή έχετε μόλις δηλώσει αυτό το αντικείμενο, αλλά δεν το έχετε αρχικοποιήσει ή ενσαρκώσει. Και κάθε φορά που προσπαθείτε να προσπελάσετε κάποια ιδιότητα ή μέθοδο σε αυτό, θα πετάει NullPointerException το οποίο είναι λογικό.

Δείτε επίσης το παρακάτω παράδειγμα:

String a = null;
System.out.println(a.toString()); // NullPointerException will be thrown
Σχόλια (1)

Ένας δείκτης null είναι ένας δείκτης που δεν δείχνει πουθενά. Όταν αποαναφέρετε έναν δείκτη p, λέτε "δώσε μου τα δεδομένα στη θέση που είναι αποθηκευμένα στο "p". Όταν ο p είναι ένας δείκτης null, η θέση που είναι αποθηκευμένη στον p είναι πουθενά, λέτε "δώσε μου τα δεδομένα στη θέση 'πουθενά'". Προφανώς, δεν μπορεί να το κάνει αυτό, οπότε πετάει μια εξαίρεση null pointer exception.

Γενικά, αυτό συμβαίνει επειδή κάτι δεν έχει αρχικοποιηθεί σωστά.

Σχόλια (3)