Per capire cosa significa null in Java, diamo un'occhiata a un'analogia con i numeri: il numero 0 simboleggia l'assenza di qualcosa e null significa la stessa cosa quando si tratta di tipi di dati di riferimento. Se a un campo di un tipo di riferimento (come String , Object o StringBuilder ) non viene assegnato esplicitamente un valore, allora, per analogia con i tipi primitivi, riceve un valore predefinito e tale valore è null :

Codice Uscita console

public class Solution {

    public static int i;
    public static String s;

    public static void main(String[] args) {
        System.out.println(i);
        System.out.println(s);
    }
}
                    
0
nullo

Ma se dichiari un array come questo:


String[] strings = new String[12];

verrà creato un array contenente 12 elementi e tutti saranno null :

Codice Uscita console

public class Solution {
    public static void main(String[] args) {
        String[] strings = new String[12];

        for (int i = 0; i < strings.length; i++) {
            System.out.println("Element " + i + ":" + strings[i]);
        }
    }
}
                    
Elemento 0: nullo
Elemento 1: nullo
Elemento 2: nullo
Elemento 3: nullo
Elemento 4: nullo
Elemento 5: nullo
Elemento 6: nullo
Elemento 7: nullo
Elemento 8: nullo
Elemento 9: nullo
Elemento 10: nullo
Elemento 11: nullo

Come puoi vedere, quando concatenato con una stringa, il valore null diventa la stringa " null ". Detto questo, se chiami il metodo toString() su di esso, in questo modo:


String[] strings = null;
System.out.println(strings.toString());

quindi otterrai una NullPointerException (discuteremo le eccezioni in dettaglio più avanti). La stessa cosa accade se provi a chiamare qualsiasi altro metodo su null (l'eccezione sono i metodi statici, che imparerai a conoscere a breve):


public static void main(String[] args) {
    StringBuilder sb = null;
    sb.append("test"); // This will compile, but there will be a runtime error
}

null è, tra le altre cose, una parola chiave riservata (come public o static ), quindi non puoi creare una variabile, un metodo o una classe denominata null . Come le altre, questa parola chiave fa distinzione tra maiuscole e minuscole (potresti aver notato che scriviamo null in minuscolo ovunque). Questo significa:


String firstName = Null; // Compilation error

String secondName = NULL; // Compilation error

String fullName = null; // This will compile

Diamo un'occhiata a cos'altro puoi e non puoi fare con null :

  • Puoi assegnare null a qualsiasi riferimento:

    
    StringBuilder sb = null;
                
  • null può essere convertito in qualsiasi tipo di riferimento:

    
    String s = (String) null; // This will compile, but doing this doesn't make any sense :)
                
  • null non può essere assegnato a una variabile primitiva:

    
    int i = null; // This won't compile
                
  • null può essere confrontato usando == e !=

  • null == null restituisce true

Nelle lezioni precedenti abbiamo parlato di come ogni cosa in Java sia un oggetto e ogni oggetto abbia un tipo.

Cosa possiamo dire di null a questo riguardo? null è un valore letterale di un certo tipo e questo tipo non ha nome. E poiché questo tipo non ha nome, è impossibile dichiarare una variabile di questo tipo o eseguirne il cast. Pertanto, null è l'unico rappresentante di questo tipo senza nome. In pratica, possiamo ignorare questo tipo e pensare a null come a un letterale speciale che può essere assegnato a qualsiasi variabile di riferimento.

Cose da ricordare:

  • null è il valore predefinito per i tipi di dati di riferimento
  • null significa "nessun valore"
  • Se chiamiamo un metodo su un oggetto il cui valore è null , il codice verrà compilato ma in fase di esecuzione otterremo una NullPointerException .