2012-04-11 7 views
8

Vorrei ricevere un avvertimento quando un riferimento a un oggetto potrebbe potenzialmente generare un'eccezione di riferimento Null, in modo da poter scrivere un codice difensivo per questi.È disponibile la verifica del codice statico per potenziali riferimenti a oggetti nulli?

Ho guardato Resharper, ma non ho visto nulla che lo portasse a termine.

Contratti di codice è probabilmente un antipasto; l'applicazione è abbastanza grande ed è scritta in .NET 3.5, prima che i contratti di codice diventassero ufficialmente disponibili.

+0

Non sarebbe più semplice controllare sempre per vedere se il riferimento all'oggetto è 'null'? Puoi anche fare un altro percorso e assicurarti che l'oggetto che usi non possa essere nullo. –

+1

Per * ogni * riferimento a un oggetto? : o Alcuni di essi non saranno mai nulli (sono impostati nel costruttore). –

+0

Anche se non stai usando i Contratti di codice, dovresti scrivere clausole di salvaguardia all'inizio dei tuoi metodi. – jason

risposta

3

Resharper esegue effettivamente qualcosa di simile. Eventuali NullReferenceExpections sono evidenziate nell'IDE in blu, con i tooltip quando si passa sopra di loro.

enter image description here

ReSharper poi tiene traccia di eventuali errori e avvisi in essa la propria finestra i risultati delle ispezioni (separati da errori del compilatore di Visual Studio e avvisi).

enter image description here

+0

Appariranno nell'elenco di avvisi di analisi? È possibile che vengano sepolti in un mare di altri avvertimenti. –

+0

Oh capisco cosa intendi. Non compariranno nella VS Error List; Resharper mantiene la propria finestra per navigare e tenere traccia dei problemi del codice. Aggiornare la mia risposta di conseguenza. – raveturned

+1

@RobertHarvey hai finito con l'uso di ReSharper? Ho appena provato la versione di prova, per vedere se riprende un problema nullo simile (lo fa), ma per impostazione predefinita mi ha dato qualche migliaio di avvertimenti/errori per la soluzione, molti dei quali non li ho cura di – Stijn

0

In generale, a meno che non specificatamente inizializzato un oggetto, si può sempre avere il potenziale per lanciare un riferimento oggetto null, almeno per quanto riguarda il compilatore è interessato.

affinché un algoritmo possa verificare se un riferimento all'oggetto può essere potenzialmente nullo, dovrebbe attraversare ogni possibile percorso che il programma può intraprendere e che include percorsi in qualsiasi libreria esterna che si sta utilizzando. Anche per i programmi più semplici, un tale algoritmo ucciderebbe le prestazioni del compilatore.

+0

Bene, non deve necessariamente controllare * ogni * volta che compilo. Principalmente, sto cercando le eccezioni di "prima possibilità", non le situazioni in cui un oggetto è inizializzato, ma può essere impostato su null successivamente (raramente, se mai, lo faccio). –

0

Sono contrario all'idea di difendere ciecamente contro null per ogni campo disponibile nel codice e all'interno di ciascun metodo.

Il seguente aiuto me decidere su dove per controllare contro i valori nulli:

1- Chi sarà invocano i metodi?
Se un metodo è privato e si ha il controllo su come viene acceduto, non vedo che abbia senso proteggersi dai controlli null a meno che non faccia parte della logica del metodo aspettarsi valori nulli. Se un metodo è esposto al pubblico (come un'API), ovviamente i controlli nulli dovrebbero essere una grande preoccupazione.

2- Software Design:
immagine che hai sta chiamando method1(fromAnimalToString(animal)); e per qualche motivo fromAnimalToString() mai restituisce null (Anche se potrebbe restituire una stringa vuota invece).
Poi in tal caso, non avrebbe senso per controllare animal != null in Method1() 's corpo

3- Testing:
in ingegneria del software, è quasi impossibile per testare tutti i possibili scenari che possono sempre eseguire. Tuttavia, prova scenari normali e alternativi e assicurati che il flusso sia come previsto.

+0

Chiedo perché ho rilasciato il progetto un paio di volte per il test e sono apparse eccezioni di riferimento nulle che non erano evidenti nei miei test di sviluppo. –

+0

Penso che in un ambiente ideale, gli sviluppatori facciano del loro meglio per ridurre al minimo il verificarsi di bug. In caso di sistemi complessi, è compito del QA cercare di produrre scenari a cui gli sviluppatori non hanno pensato in modo da poter trovare scenari alternativi durante la fase di controllo qualità che potrebbero portare a possibili NullPointerExceptions. In questi casi, potrebbe non essere sufficiente controllare nullo, ma anche prendere le misure logiche appropriate in base a ciò che ha causato il parametro come nullo. – SiN

Problemi correlati