是否有任何工具可以在类成员变量中检测可能的NullPointerException

时间:2013-08-19 09:11:24

标签: java android

在我们创建一个具有以下类的对象之后我们有一个NullPointerException,因为成员变量mTest为null,

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来检测空指针引用,但它们都无法检测到上述问题。有什么建议吗?我知道程序员不应该编写这些错误,但我更感兴趣的是检测它们而不是修复它们。

谢谢!

2 个答案:

答案 0 :(得分:-1)

我会尝试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 可能不会发生......而不是 不会发生。


参考文献:

答案 1 :(得分:-1)

尝试使用try / catch块并让catch块看起来像这样:

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

这里System.out可以被任何输出格式(logger,printwriter等)替换