3

メンバー変数 mTest が null であるため、以下のクラスでオブジェクトを作成した後、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 を使用していますが、どちらも上記の問題を検出できません。何か提案はありますか?プログラマーがこれらのバグをコーディングするべきではないことはわかっていますが、修正するよりも検出することに関心があります。

ありがとう!

4

2 に答える 2

-1

try/catch ブロックを使用してみて、catch ブロックを次のようにします。

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

ここで、System.out を任意の出力形式 (logger、printwriter など) に置き換えることができます。

于 2013-08-19T10:24:44.210 に答える
-1

Findbugs と PMD を試してみます。どちらもバグを検出しない場合、次に試みることは、これを検出するカスタム PMD チェッカーを作成できるかどうかを確認することです。

実際には、参照フィールドが初期化される前に使用されているケースを静的に検出することは困難である可能性があります。あなたの例は、扱いやすい数少ないケースの1つであると感じています。たとえば、次のバリエーションを検討してください。

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 に答える