2012-04-11 21 views
8

我想要一種方式來獲取警告,當一個對象引用可能會拋出一個空引用異常,以便我可以爲這些編寫防禦代碼。是否存在可用的空對象引用的靜態代碼驗證?

我曾看過Resharper,但沒有看到任何可以完成此操作的東西。

代碼合同可能是一個非首發;該應用程序非常大,並且在代碼合同正式發佈之前,它是用.NET 3.5編寫的。

+0

只要總是檢查對象的引用是否爲null,是不是更容易?你也可以走另一條路線,並確保你使用的對象不能爲空。 – 2012-04-11 15:47:28

+1

用於*每個*對象引用? :o它們中的一些永遠不會爲空(它們在構造函數中設置)。 – 2012-04-11 15:48:23

+0

即使你沒有使用代碼合約,你應該在你的方法開始時寫下守衛子句。 – jason 2012-04-11 16:04:53

回答

3

Resharper確實實現了這樣的功能。可能的NullReferenceExpections在IDE中以藍色高亮顯示,當您將鼠標懸停在它們上方時有工具提示。

enter image description here

ReSharper的再跟蹤潛在的錯誤和警告在它自己的檢查結果窗口(從Visual Studio的編譯器錯誤和警告分開)。

enter image description here

+0

它們是否會顯示在分析警告列表中?他們有可能被埋在其他警告海洋中。 – 2012-04-11 15:58:56

+0

哦,我明白你的意思了。它們不會出現在VS錯誤列表中; Resharper維護它自己的窗口來瀏覽和跟蹤代碼問題。相應地更新我的答案。 – raveturned 2012-04-11 16:16:40

+1

@RobertHarvey你最終使用ReSharper?我剛剛嘗試過這個試驗,看看它是否會出現類似的空值問題(它確實如此),但是默認情況下,它給了我幾千個解決方案的警告/錯誤,其中很多我沒有關心。 – Stijn 2012-11-16 10:32:21

0

一般來說,除非你明確初始化的對象,它總是可以有拋出一個空對象引用,至少就因爲編譯器而言的潛力。

爲了使算法檢查對象的引用是否可能爲空,它必須遍歷程序可以採用的所有可能的路徑,並且該路徑包含您可能正在使用的任何外部庫中的路徑。即使是最簡單的程序,這種算法也會導致編譯器的性能下降。

+0

那麼,它不一定要檢查*每一次*我編譯。大多數情況下,我正在尋找「一次機會」異常,而不是在初始化對象的情況下,但可能會在稍後設置爲空(如果有的話,我很少這樣做)。 – 2012-04-11 16:00:19

0

我反對在代碼中和每個方法內可用的每個字段盲目防禦null的想法。

下面幫我決定去哪裏檢查對空值:

1誰將調用你的方法是什麼?
如果一個方法是私有的,並且您可以控制它的訪問方式,我不認爲保護它免受空值檢查是有意義的,除非它是方法邏輯的一部分以期望空值。 如果一種方法暴露給公衆(如API),那麼當然空檢查應該是一個巨大的問題。

2-軟件設計:
圖片已呼籲method1(fromAnimalToString(animal));,由於某種原因fromAnimalToString()從不返回null(雖然可能會返回一個空字符串代替)。
那麼在這樣的情況下,這是沒有意義的檢查中方法1 animal != null()的身體

3-測試:
在軟件工程中,這幾乎是不可能的測試所有可能的方案,可以不斷執行。但是,測試正常和替代方案並確保流程符合預期。

+0

我在問,因爲我已經發布了幾次測試項目,並且出現了在我的開發測試中不明顯的空引用異常。 – 2012-04-11 16:53:28

+0

我認爲在一個理想的環境中,開發人員盡力減少錯誤發生。在複雜系統的情況下,嘗試產生開發人員沒有想到的方案是QA的工作,以便可以在QA階段找到可能導致可能的NullPointerException的備選方案。在這種情況下,它可能不足以檢查null,還可能根據導致參數爲空的原因採取適當的邏輯度量。 – SiN 2012-04-12 11:40:23

相關問題