Se utilizzi un codice di terze parti che restituisce null
, è molto meglio controllare il valore restituito.
ThirdPartyValue thirdPartyValue = thirdParty.getValue();
if (null == thirdPartyValue) {
...
}
Modifica: Java 8 è fuori! Ora dovrebbe essere
Optional<ThirdPartyValue> thirdPartyValue = Optional.ofNullable(thirdParty.getValue());
Un NullPointerException
è insidioso e fuorviante, perché significa che hai un errore da qualche altra parte, dove una variabile è stata impostata su null
senza che tu te lo aspetti.
Ripeto, il bug non è dove è stato lanciato NullPointerException
, il bug è precedente nel tuo codice , dove una variabile è stata impostata a null
senza che tu te lo aspetti.
Catching NullPointerException
significa che stai nascondendo o scusando il bug effettivo.
Nel tuo codice, è molto meglio eliminare null
ogni volta che è possibile, e per questo anche variabili mutabili.
Se ricevi un'eccezione, non prenderla e restituisci null
, invece esegui il wrapping e rilancia l'eccezione.
Se hai un metodo che a volte non dovrebbe restituire un valore, puoi restituire un Collection
vuoto o un Opzionale , che è nuovo in Java 8.
Se non imposti mai una variabile su null
non puoi mai avere un null
imprevisto.
Non consentire parametri null
:
public void method(A param1, B param2, C param3) {
requireNonNull(param1, param2, param3);
...
}
public static void requireNonNull(Object... parameters) {
Stream.of(parameters).forEach(Objects::requireNonNull);
}
Evita di creare variabili "risultato" temporaneamente null
:
Invece di:
public Result method() {
Result result = null; // <- this smells
try {
result = ...;
} catch (SomeException e) {
LOGGER.log(Level.WARNING, "Exception "+e.getMessage(), e);
}
return result;
}
dovresti:
public Result method() {
try {
return ...;
} catch (SomeException e) {
throw new MyPossiblyRuntimeException(e);
}
}
Prima o poi inizierai a vedere l'utilizzo di null
(e variabili mutabili) come odore di codice.
Sono sicuro che puoi inventare altri modi intelligenti per evitare null
, essere creativi!
tl; dr : il NullPointerException
non dovrebbe mai essere lanciato in primo luogo, quindi non prenderlo, perché ciò significa che stai nascondendo il bug effettivo.