3

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

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

谢谢!

4

2 回答 2

-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可能不会发生……而不是它不会发生。


参考:

于 2013-08-19T09:44:01.903 回答
-1

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

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

这里的 System.out 可以替换为任何输出格式(记录器、打印机等)

于 2013-08-19T10:24:44.210 回答