Java: differenza tra String a = null e String a = new String ()

1

È una domanda abbastanza ingenua da fare ma ho avuto questo dubbio durante la programmazione per Android. Io uso per inizializzare le mie nuove stringhe come String a=null , quindi nel mio codice rimane una probabilità di ottenere NullPointerException se dimentico di inizializzare la variabile prima di accedervi, ma per quanto riguarda l'altro caso. Inoltre quale dovrebbe essere usato?

    
posta Rajat Saxena 27.07.2015 - 18:04
fonte

3 risposte

11

Per prima cosa chiariamo qualcosa: dici che dopo aver assegnato un valore nullo alla variabile potresti dimenticarti di inizializzarlo, ma assegnando null ad esso stai effettivamente inizializzandolo.

public static void main (String args[]){
    String s;       
    System.out.println(s); // compiler error variable may not be initialized
}

vs

public static void main (String args[]){
    String s=null;      
    System.out.println(s); // no compiler error
    System.out.println(s.equals("helo")); // but this will generate an exception
}

Quindi, dopo aver fatto String s=null; , non c'è modo di dimenticare di inizializzare perché lo hai inizializzato.

Essendo chiaro, ti consiglierei di usare un "default intelligente". Nel tuo caso forse la stringa vuota "" sarebbe un buon valore predefinito se vuoi evitare NullPointerException . D'altra parte, a volte è auspicabile che il programma produca un'eccezione perché indica che qualcosa di sbagliato è successo sotto il cofano che non avrebbe dovuto accadere.

    
risposta data 27.07.2015 - 18:26
fonte
8

In generale si desidera mantenere la dichiarazione e l'inizializzazione il più vicino possibile per minimizzare esattamente il tipo di problema di cui si sta parlando.

C'è anche il problema dell'inizializzazione ridondante in cui il valore nullo che stai assegnando non viene mai utilizzato quale codice extra che danneggia la leggibilità anche se l'assegnazione ridondante viene ottimizzata dal compilatore.

A volte l'assegnazione di una sorta di valore predefinito è inevitabile, ad esempio se dichiari di essere in attesa di un tentativo, inizializza dentro e usalo in seguito. Per altri tipi, puoi trovare spesso un valore predefinito più naturale come una lista vuota.

    
risposta data 27.07.2015 - 18:09
fonte
0

Ci sono due diverse visualizzazioni di "inizializzazione". Uno è che una variabile ha un valore definito dopo l'inizializzazione. Uno è che una variabile ha un valore utile . Né l'impostazione di questa variabile su null o su nuova String () lo imposterà su un valore utile .

L'uso della variabile è un bug, sia esso non pubblicizzato o semplicemente non impostato su qualcosa di utile. Il compilatore è molto bravo nel trovare situazioni in cui una variabile viene utilizzata mentre non è inizializzata (e non lo consente). Ma impostando la variabile su null o new String (), si rimuove l'abilità del compilatore di dirti quando non c'è alcun valore utile. Ad esempio:

String a = null;
if (condition1) a = "Yes";
else if (condition2) a = "No";

Se nessuna delle due condizioni è vera, a non è impostato su qualcosa di utile, ma il compilatore non può parlarne più. Quindi abbiamo un bug, ma hai distrutto la capacità dei compilatori di segnalarlo. Se non avessi inizializzato a, il compilatore te lo direbbe.

    
risposta data 16.12.2016 - 19:49
fonte

Leggi altre domande sui tag