3

次の Android コードがあります。

public final List<MyObj> getList()  {
    Cursor cursor = null;
    try {
        final String queryStr = GET_LIST_STATEMENT;
        cursor = db.rawQuery(queryStr, new String[] {});
        List<MyObj> list = null;
        //here I get the data from de cursor.
        return list ;
    } catch (SQLiteFullException ex) {
        //do something to treat the exception.
    } finally {
        if (cursor != null) {
            cursor.close();
        }
    }
}

このコードに対して PMD 分析を実行すると、次の問題が発生します。Found 'DD'-anomaly for variable 'cursor' (lines '182'-'185').

  • 行 182 は次のとおりCursor cursor = null;です。
  • 185 行目は次のとおりです。cursor = db.rawQuery(queryStr, new String[] {});

したがって、問題は182行目で早期初期化を行っていることだと理解していますが(182行目と18​​5行目の間の変数を読み取ったことはありません)、そうしないとコードを取得できませんcursorfinally ブロックで を閉じます。

この場合どうすればいいですか?この PMD の問題を無視しますか? この特定の種類の DD 異常 (すべての DD 異常ではない) が発生しないように PMD を構成できますか? PMD は、この問題を起こさないほど十分にスマートであるべきですか?

私が考える DD 異常の別の例は、実際の問題ではありません。

    Date distributeDate;
    try {
        distributeDate = mDf.parse(someStringDate);
    } catch (ParseException e) {
        Log.e("Problem", "Problem parsing the date of the education. Apply default date.");
        distributeDate = Calendar.getInstance().getTime();
    }

この場合、異常はdistributeDate変数で発生します。

4

1 に答える 1

2

ドキュメントは非常に理解しやすいです:

警告を抑制するために注釈を使用するか、次のようにします。

// This will suppress UnusedLocalVariable warnings in this class
@SuppressWarnings("PMD.UnusedLocalVariable")
public class Bar {
 void bar() {
  int foo;
 }
}

またはコメントを使用します:

public class Bar {
 // 'bar' is accessed by a native method, so we want to suppress warnings for it
 private int bar; //NOPMD
}

特定のコードに関して言えば、それを処理する最も簡単な方法は、finallyブロックを使用しないことです。これは、ブロックに最適な場所のように見えますが。

于 2013-01-15T16:56:58.823 に答える