JavaRush /Java Blog /Random-IT /Trucchi e suggerimenti. Come evitare NullPointerException...
DarthVictor
Livello 28

Trucchi e suggerimenti. Come evitare NullPointerException nelle applicazioni Java

Pubblicato nel gruppo Random-IT
Trucchi e suggerimenti.  Come evitare NullPointerException nelle applicazioni Java - 1Oggi ti mostrerò semplici tecniche su come evitare NullPointerException nelle tue applicazioni. Sono facili da seguire, ma migliorano significativamente l'affidabilità e la qualità del codice. Inoltre, secondo la mia esperienza, il primo suggerimento avrà un impatto notevole sulla qualità del codice. Se conosci altri trucchi di programmazione Java, sentiti libero di condividerli nei commenti. Trucchi e suggerimenti.  Come evitare NullPointerException nelle applicazioni Java - 2

Chiama i metodi equals() e equalsIgnoreCase() su una stringa letterale nota anziché su un oggetto sconosciuto

Chiama sempre un metodo equals()su una stringa nota che sai non essere null. Il metodo equals()è simmetrico, cioè chiama a.equals(b)e b.equals(a)darà lo stesso risultato (if ae bnot null), e per questo motivo molti programmatori non prestano attenzione a quali oggetti vengono chiamati equals(), y ao y b. Uno degli effetti collaterali di ciò è una NullPointerException se il metodo viene richiamato null.
Object unknownObject = null;

//плохой способ - может вызвать NullPointerException
if(unknownObject.equals("knownObject")){
   System.err.println("This may result in NullPointerException if unknownObject is null");
}

//правильный способ - исключение NullPointerException не возникнет, даже если unknownObject null
if("knownObject".equals(unknownObject)){
    System.err.println("better coding avoided NullPointerException");
}
Questo era il suggerimento più semplice per evitare NullPointerException, ma da solo apporta un enorme miglioramento perché il metodo equals()è onnipresente.

Scegli valueOf() invece di toString() nei casi in cui entrambi producono lo stesso risultato

Poiché la chiamata toString()a un riferimento con un valore nullgenera una NullPointerException, è meglio utilizzare la chiamata valueOf()quando possiamo ottenere lo stesso risultato, poiché la chiamata valueOf()da nullrestituisce null. Ciò è particolarmente vero per le classi wrapper come Integer, Floato . DoubleBigDecimal
BigDecimal bd = getPrice();
System.out.println(String.valueOf(bd)); //не выбрасывает NPE
System.out.println(bd.toString()); //выбрасывает "Exception in thread "main" java.lang.NullPointerException"
Utilizza questi suggerimenti quando non sei sicuro che un oggetto possa esistere nullo meno.

Utilizzare nullmetodi e librerie -safe

Esistono molte librerie open source che si assumono il pesante onere di testare null. Uno dei più comuni proviene StringUtilsda Apache Commons. Utilizzando metodi come StringUtils.isBlank(), isNumeric(), isWhiteSpace()ecc. non devi preoccuparti di lanciare una NullPointerException.
//Методы StringUtils являются null-безопасными, они не вызовут NullPointerException
System.out.println(StringUtils.isEmpty(null));
System.out.println(StringUtils.isBlank(null));
System.out.println(StringUtils.isNumeric(null));
System.out.println(StringUtils.isAllUpperCase(null));
Risultato: true true false false Eppure, prima dell'uso, non dimenticare di leggere la documentazione nulldei metodi e delle classi sicuri. Questo è un altro dei migliori trucchi Java che porta a enormi miglioramenti senza richiedere troppi sforzi.

Cerca di non restituire nullun metodo, è meglio restituire una raccolta vuota

Questo è un altro buon suggerimento per la programmazione Java descritto da Joshua Bloch nel suo libro Java: Effective Programming. Quando si restituiscono raccolte o array vuoti, assicurarsi che la chiamata a metodi di base come size()o length()non generi un'eccezione NullPointerException. La classe Collectionsdichiara specificamente implementazioni convenienti di elenchi, insiemi e dizionari vuoti: Collections.EMPTY_LIST, Collections.EMPTY_SETe Collections.EMPTY_MAP. Per esempio:
public List getOrders(Customer customer){
   List result = Collections.EMPTY_LIST;
   return result;
}
Allo stesso modo, puoi usarlo Collections.EMPTY_SETinvece Collections.EMPTY_MAPdi restituire null.

Utilizza le annotazioni @NotNull e @Nullable

Nella descrizione dei tuoi metodi, puoi definire nullconvenzioni di sicurezza del metodo utilizzando annotazioni @NotNulle @Nullable per indicare se un metodo può restituire nullo meno. I compilatori e gli IDE moderni possono utilizzare queste annotazioni per analizzare il codice e fornire consigli appropriati, ad esempio, sulla mancanza di un controllo per nullo, viceversa, sulla possibilità di rimuovere un controllo non necessario che intasa il codice. Tali annotazioni, ad esempio, sono supportate dall'IDE IntelliJ e da FindBugs e sono incluse anche in JSR 305. Ma anche se il tuo IDE non supporta tali annotazioni, costituiranno di per sé una buona documentazione. Guardando @NotNulle @Nullablesarà più semplice per il programmatore capire dove aggiungere un check nulle dove no. Questa, tra l'altro, è una pratica abbastanza nuova tra i programmatori Java e ci vorrà del tempo prima che si diffonda.

Evita l'autoboxing e l'autounboxing non necessari nel tuo codice

Ciò non solo porta alla creazione di oggetti temporanei non necessari, ma l'autoboxing può anche lanciare una NullPointerException se la classe wrapper è null. Ad esempio, il codice seguente genererà un'eccezione NullPointerException se la voce della persona non contiene un numero di telefono e restituisce null.
Person ram = new Person("ram");
int phone = ram.getPhone();
Quando si utilizza l'autoboxing o l'autounboxing, non solo le uguaglianze, ma anche le disuguaglianze <possono >risultare in una NullPointerException.

Seguire le convenzioni e definire valori predefiniti ragionevoli.

Uno dei modi migliori per evitare NullPointerException in Java è dichiarare e seguire correttamente le convenzioni di codifica. La maggior parte delle NullPointerException si verifica quando si tenta di creare un oggetto senza disporre di tutti i dati e le dipendenze richiesti. Impedendo la creazione di oggetti incompleti rifiutando gentilmente tali richieste, ti salverai da un gran numero di NullPointerException in futuro. Allo stesso modo, se consenti la creazione di oggetti, dovresti scegliere un valore predefinito ragionevole. Ad esempio, un oggetto classe Employeenon può essere creato senza un nome e id, ma potrebbe non avere un numero di telefono. In questo caso, gli oggetti Employeesenza numero potrebbero invece restituire zero null. Anche se questo comportamento dell'oggetto dovrebbe essere pensato in anticipo, potrebbe essere più facile verificarlo nullche chiamare un numero inesistente. In questo caso, avere condizioni aggiuntive su quali campi lo sono nulle quali no aiuterà a prendere la decisione giusta. In generale, la scelta tra mandare in crash immediatamente il programma o assegnarlo nullè un'importante decisione di progettazione e, una volta fatta la scelta, è necessario seguirla in modo coerente.

Imposta restrizioni a livello DBMS

Quando si utilizza un database per memorizzare gli oggetti del programma, come Clienti o Ordini, è consigliabile specificare la " nullness" degli oggetti a livello DBMS, utilizzando le restrizioni di tabella appropriate. I database spesso contengono informazioni provenienti da più fonti e l'introduzione di controlli per i valori mancanti migliorerà l'integrità dei dati. Inoltre, la presenza di controlli null a livello DBMS li ridurrà nel tuo codice Java: caricando i dati dal database negli oggetti Java, puoi essere sicuro della loro presenza e rimuovere " " non necessari != nulldal codice del programma.

Utilizza il modello oggetto nullo

La creazione di oggetti speciali Nullè un altro modo per evitare NullPointerExcpetion in Java. Supponiamo che qualche metodo nella nostra applicazione restituisca un oggetto con cui il programma successivamente lavorerà chiamando i suoi metodi. Ad esempio, il metodo Collection.iterator()restituisce un oggetto della classe Iteratorutilizzato per scorrere la raccolta. Quindi, se l'oggetto originale non ha alcun iteratore, nullpuoi invece restituire un Nulloggetto speciale che ha un metodo hasNext()che restituisce sempre false. Questo è tutto, caro lettore, qui concludo i miei suggerimenti per eliminare gli errori NullPointerException nei programmi Java. Apprezzerai quanto possano essere utili queste regole semplici e non gravose. Come promemoria, se desideri condividere altri trucchi NullPointerException nei programmi Java, sentiti libero di farlo nei commenti. Tradotto appositamente per gli studenti JavaRush. Originale
Commenti
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION