2012-04-11 6 views
8

Ich möchte einen Weg, um Warnungen zu erhalten, wenn eine Objektreferenz möglicherweise eine Nullreferenzausnahme werfen könnte, so dass ich defensiven Code für diese schreiben kann.Ist die statische Codeverifizierung für mögliche Nullobjektverweise verfügbar?

Ich habe Resharper angeschaut, aber habe dort nichts gesehen, was dies bewirkt.

Code Contracts ist wahrscheinlich ein Nicht-Starter; Die Anwendung ist ziemlich groß und in .NET 3.5 geschrieben, bevor Code Contracts offiziell verfügbar wurden.

+0

Wäre es nicht einfacher, einfach immer zu überprüfen, ob der Verweis auf das Objekt "null" ist? Sie können auch eine andere Route wählen und sicherstellen, dass das von Ihnen verwendete Objekt nicht null sein kann. –

+1

Für * alle * Objektreferenzen? : o Einige von ihnen werden niemals null sein (sie sind im Konstruktor gesetzt). –

+0

Auch wenn Sie keine Code-Verträge verwenden, sollten Sie am Anfang Ihrer Methoden Wächterklauseln schreiben. – jason

Antwort

3

Resharper erreicht tatsächlich so etwas. Mögliche NullReferenceExpections werden in der IDE in blau hervorgehoben, mit QuickInfos, wenn Sie den Mauszeiger darüber bewegen.

enter image description here

ReSharper hält dann den Überblick über mögliche Fehler und Warnungen in einem eigenen Prüfergebnissen Fenster (getrennt von Visual Studio Compiler-Fehler und Warnungen).

enter image description here

+0

Werden sie in der Liste der Analysewarnungen angezeigt? Es ist möglich, dass sie in einem Meer von anderen Warnungen begraben werden. –

+0

Oh ich sehe was du meinst. Sie werden nicht in der VS-Fehlerliste angezeigt. Resharper behält sein eigenes Fenster zum Navigieren und Verfolgen von Code-Problemen bei. Aktualisierung meiner Antwort entsprechend. – raveturned

+1

@RobertHarvey hast du ReSharper benutzt? Ich habe gerade den Prozess ausprobiert, um zu sehen, ob er ein ähnliches Null-Problem aufgreift, aber standardmäßig gab es mir einige tausend Warnungen/Fehler für die Lösung, von denen ich viele nicht kenne Wert darauf legen. – Stijn

0

Im Allgemeinen, wenn Sie speziell ein Objekt initialisiert, kann es immer das Potenzial, einen Null-Objekt Bezug zu werfen, zumindest so weit wie der Compiler geht.

Damit ein Algorithmus überprüfen kann, ob ein Verweis auf das Objekt möglicherweise null sein kann, müsste er alle möglichen Pfade durchlaufen, die Ihr Programm ausführen kann, und das enthält Pfade in externen Bibliotheken, die Sie möglicherweise verwenden. Selbst für die einfachsten Programme würde ein solcher Algorithmus die Leistung Ihres Compilers zunichtemachen.

+0

Nun, es muss nicht unbedingt * jedes * Mal, das ich kompiliere, überprüft werden. Meistens suche ich nach "First-chance" -Ausnahmen, nicht nach Situationen, in denen ein Objekt initialisiert wird, sondern kann später auch auf null gesetzt werden (selten, wenn überhaupt, mache ich das). –

0

Ich bin gegen die Idee der blinden Verteidigung gegen null für jedes Feld im Code und innerhalb jeder Methode.

Die folgende Hilfe mir zu entscheiden, wo gegen null-Werte zu überprüfen:

1- Wer Ihre Methoden werden den Aufruf wird?
Wenn eine Methode privat ist und Sie kontrollieren können, wie auf sie zugegriffen wird, sehe ich keinen Sinn darin, vor NULL-Prüfungen zu schützen, es sei denn, es ist Teil der Logik der Methode, NULL-Werte zu erwarten. Wenn eine Methode der Öffentlichkeit zugänglich gemacht wird (z. B. eine API), sollten natürlich Null-Prüfungen ein großes Problem darstellen.

2- Software Design:
Bild Sie haben method1(fromAnimalToString(animal)); und aus irgendeinem Grund fordern fromAnimalToString() nie null zurück (Obwohl möglicherweise eine leere Zeichenfolge statt zurück).
Dann in einem solchen Fall würde es keinen Sinn machen animal != null in method1 zu überprüfen() 's Körper

3- Prüfung:
In Software-Engineering, ist es fast unmöglich, alle möglichen Szenarien zu testen, das jemals können ausführen. Testen Sie jedoch normale und alternative Szenarien und stellen Sie sicher, dass der Fluss wie erwartet verläuft.

+0

Ich frage, weil ich das Projekt ein paar Mal zum Testen freigegeben habe, und Null Referenz Ausnahmen erschienen, die nicht in meinen Entwicklungstests offensichtlich waren. –

+0

Ich denke in einer idealen Umgebung, Entwickler versuchen ihr Bestes, um das Auftreten von Fehlern zu minimieren. Im Falle eines komplexen Systems ist es die Aufgabe von QA, Szenarien zu erstellen, an die Entwickler nicht gedacht haben, sodass während der QA-Phase alternative Szenarien gefunden werden, die zu möglichen NullPointerExceptions führen können. In solchen Fällen reicht es unter Umständen nicht aus, nach NULL zu suchen, sondern auch die geeigneten logischen Maßnahmen zu treffen, die darauf zurückzuführen sind, dass der Parameter als null ausgegeben wurde. – SiN

Verwandte Themen