NullReferenceException
è il più malvagio di tutte le eccezioni in un'applicazione. Significa che un riferimento potenzialmente non nullo non è stato verificato per un valore nullo prima che fosse acceduto.
È malvagio, perché il runtime non è in grado di determinare ciò che si aspettava di trovare nel riferimento, quindi non è in grado di dirti quale esattamente non è riuscito a de-referenziare.
Lo stack trace è l'unico amico in questa eccezione, in cui è possibile identificare almeno il metodo che ha generato l'eccezione. Se il tuo codice è abbastanza accurato, dovrebbe identificare una piccola quantità di codice da controllare.
Inoltre, se si sta eseguendo una build di debug e si hanno le informazioni di debug con gli assembly, si otterranno anche i numeri di riga di origine nello stack trace, in modo da poter sapere esattamente quale linea il metodo ha fallito.
La vera risposta è quello di evitare che questa eccezione da mai essere gettato.È un indicatore che alcuni codici sono stati scritti male, non riuscendo a gestire lo scenario in cui un riferimento era null
.
Se si dispone di un metodo chiamato in cui è necessario fare qualcosa con un argomento di riferimento di tipo che ha bisogno di essere de-riferimento ad un certo punto, verificare la presenza di null
e gettare ArgumentNullException
, indicando il nome del parametro:
if(parameter == null)
throw new ArgumentNullException("parameter");
Se si sta eseguendo un'operazione all'interno di una classe e una proprietà impostabile può essere impostato per null
, controllare prima di de-riferimento e gettare un InvalidOperationException
che indica il problema:
if(Property == null)
throw new InvalidOperationException("Property cannot be null.");
È inoltre necessario assicurarsi che tutti i metodi che si stanno chiamando in grado di restituire tipi di riferimento siano garantiti per restituire un valore. Per tutti quelli che non lo sono, effettuare controlli simili per null
e gestire il caso in modo appropriato.
EDIT:
Per chiarire, non sto suggerendo che si esegue un controllo sulla ogni variabile di riferimento di tipo prima di de-riferimento di esso. Sarebbe una follia.
Si tratta di capire dove è possibile assegnare una variabile null
e dove non può. Se si assegna un campo privato in una classe a un valore non nullo nel costruttore e il valore non viene mai assegnato nuovamente, non è necessario verificare se il valore è null
; il design della tua classe ha fatto in modo che non possa mai essere.
Un oggetto ben progettato limiterà le opportunità per i valori null
assegnati e utilizzerà il codice di protezione appropriato per generare eccezioni quando un valore null
può essere presente.
In realtà, questo è vero per un sacco di fastidiose eccezioni. Indice fuori portata un altro colpevole. "Indice fuori intervallo:" sarebbe di grande aiuto. –
Jason