在我们创建一个具有以下类的对象之后我们有一个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来检测空指针引用,但它们都无法检测到上述问题。有什么建议吗?我知道程序员不应该编写这些错误,但我更感兴趣的是检测它们而不是修复它们。
谢谢!
答案 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等)替换