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

Java 是否有任何工具可以检测类成员变量中可能存在的NullPointerException,java,android,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 tes

在我们确实创建了一个具有以下类的对象之后,我们有一个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检测空指针延迟,但它们都无法检测到上述问题。有什么建议吗?我知道程序员不应该编写这些bug,但我更感兴趣的是检测它们,而不是修复它们


谢谢

我会尝试Findbugs和PMD。如果这两个都没有检测到bug,那么下一步要做的就是看看是否可以创建一个定制的PMD检查器来检测这个bug

实际上,静态检测引用字段在初始化之前使用的情况可能很困难。我觉得你的例子是少数几个可以处理的案例之一。考虑这种变化,例如:

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需要对代码库进行分析,以查看是否调用过is
setTest
。即使这样,你也只能确定NPE可能不会发生。。。并不是说它不会发生


参考资料:

  • -讨论了一个不同但相关的问题
  • -BugDetective使用流分析,更容易发现未初始化变量的问题

尝试使用Try/catch块,并使catch块如下所示:

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

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

使用断点调试。它正在修复错误,但没有检测到错误。使用try/catch检查NullpointerException?@Atrakeur-阅读问题。这不是他的要求。是的,它确实找到了“读取未写入的字段mTest in…”,但如果我添加一个没有实际调用的setter,Findbugs将无法检测到。是的,Findbugs和PMD现在似乎很难分析这个NPE。@neo.orz.hk-这个问题实际上比NPE更广泛。问题在于,发现这种性质的bug需要1)全局分析,2)控制流分析,以确定(在本例中)一个事件是否可以先于另一个事件发生。相比之下,Findbugs和PMD仅限于在代码结构中查找可疑模式。我认为您完全误解了这个问题。OP需要一个静态检测bug的工具。。。不是关于如何捕获结果异常的说明。netbeans IDE已经警告我“可能的空访问”(不记得确切的名称),我相信eclipse IDE也会提供。如果类不包含setter,它会提供。但我的情况是,类具有setter,但从未调用过它。