2013-03-21 60 views
2

考慮從FindBugs error desriptions爲什麼FindBugs在明確拋出NPE時提出嚴重警告?

NP如下:Null值可以保證被解除引用(NP_GUARANTEED_DEREF)

有一個語句或分支,如果執行保證一個 值是在這一點空,並且該值保證爲 取消引用(除了涉及運行時異常的前向路徑)。

請注意,檢查如if(x == null)會拋出新的 NullPointerException();被視爲x的解引用。

什麼意思是除了涉及運行時異常的前向路徑

此外,爲什麼像if (x == null) throw new NullPointerException();檢查提出警告?

+1

反而拋出InvalidArgumentException – 2013-03-21 07:39:28

+1

也許:除非在執行路徑之前拋出另一個運行時異常嗎? – assylias 2013-03-21 07:39:54

+2

是不是說'x'在比較點保證是'null',所以比較是多餘的? – SimonC 2013-03-21 07:51:27

回答

3

考慮過這種可怕的做作代碼:

String value = null; 
if (5 > 8) { 
    value = "foo"; 
} 
doSomething(); 
if (value.equals("foo")) { 
    System.out.println("value is foo"); 
} 

靜態分析可以證明valuenullequals被調用,導致NullPointerException被拋出。但是,如果對doSomething()的調用導致拋出的運行時異常,將永遠無法調用equals。這是「除涉及運行時異常的前向路徑外」的含義。

關於你的第二個問題,FindBugs的,因爲效果是一樣的,你是什麼時候發生的取消引用null值會發出警告,此代碼

if (value == null) { 
    throw new NullPointerException(); 
} 

。由於取消引用值得警告,所以任何模仿該取消引用的代碼都是值得警告的。

+0

「,因爲它與JVM的功能相同」我們在編譯時看到這個警告嗎? – Geek 2013-03-22 17:27:49

+0

@Greek - 不,我的意思是JVM拋出一個'NullPointerException'。我澄清了最後一段。 – 2013-03-22 17:29:21

+0

如何檢查引用是否爲空稱爲derefencing?我沒有做'value.someAttribute'類似 – Geek 2013-03-22 17:31:12

相關問題