2013-08-19 64 views
3

我們之後,我們創建了一個對象,具有以下類是肯定的,因爲成員變量MTEST爲空NullPointerException異常,是否有類成員變量檢測可能的NullPointerException異常任何工具

public class SettingsActivity extends PreferenceActivity { 
    private String mTest; 

    // the setter is not being called after the object is created 
    public void setTest(String test) { 
     mTest = test; 
    } 

    // ok, the activity is starting and will crash 
    @Override 
    protected void onPostCreate(Bundle savedInstanceState) { 
     super.onPostCreate(savedInstanceState); 

     mTest.replace("a", "b"); 
    } 

} 
在一些活動

Intent intent = new Intent(this, SettingsActivity.class); 
// we forgot to set the member variable... 
startActivity(intent); 

我們使用SonarQube和Android Studio來檢測空指針參考,但它們都不能檢測到上述問題。有什麼建議嗎?我知道程序員不應該編寫這些錯誤,但我更感興趣的是檢測它們而不是修復它們。

謝謝!

+0

使用斷點調試 – Raghunandan

+0

是的,它正在修復錯誤但未檢測到錯誤。 – neo

+0

使用try/catch檢查NullpointerException? – Atrakeur

回答

0

我會嘗試Findbugs和PMD。如果這兩者都沒有檢測到該錯誤,那麼接下來要做的就是查看是否可以創建一個能夠檢測到這種情況的自定義PMD檢查器。

實際上,靜態檢測在初始化之前使用引用字段的情況很可能很難。我有一種感覺,你的榜樣是少數可能會被處理的案例之一。例如,考慮這種變化:

public class SettingsActivity extends PreferenceActivity { 
    private String mTest; 

    @Override 
    protected void onPostCreate(Bundle savedInstanceState) { 
     super.onPostCreate(savedInstanceState); 

     mTest.replace("a", "b"); 
    } 

    public void setTest(String test) { mTest = testl; } 
} 

確定是否可能導致犯罪嫌疑人系在NPE需要的代碼庫看到的是setTest被稱爲有史以來的分析。即使如此,你只確定NPE 可能不會發生...不會發生它不會發生。


參考文獻:

+0

是的,這個NPE對於Findbugs和PMD來說似乎很難分析。 – neo

+1

@ neo.orz.hk - 問題實際上比NPE更廣泛。問題在於找到這種性質的錯誤包括1)全局分析,2)分析控制流以確定(在這種情況下)一個事件是否可能發生在另一個事件之前。相比之下,Findbugs和PMD僅限於在代碼結構中尋找可疑模式。 –

-1

嘗試使用try/catch塊,讓catch塊這個樣子的:

catch (Exception e){ 
e.printStackTrace(System.out); 
} 

這裏的System.out可以通過任何輸出格式(記錄儀,爲PrintWriter等)

被替換
+2

我認爲你完全誤解了這個問題。 OP需要一個靜態檢測錯誤的工具...而不是關於如何捕獲產生的異常的說明。 –

+0

netbeans IDE已經警告過我'可能的空訪問'(domt記住確切的名字),我相信eclipse IDE也會提供。 –

+0

它確實如果類不包含setter。但是我的情況是這個班上有二傳手,但從未被調用過。 – neo

相關問題