Правила PMD: как правильно решить эту проблему DD-аномалии

У меня есть следующий код 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 и 185), но если я этого не сделаю, у меня не будет кода закрытие cursor в блоке, наконец.

Что делать в этом случае? Просто игнорировать эту проблему PMD? Могу ли я настроить PMD, чтобы не вызывать этот специфический вид DD-аномалии (не все DD-аномалии)? Должен ли 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 переменная.

1 ответ

Решение

Документация довольно проста для понимания:

Либо вы используете аннотации для подавления предупреждений:

// 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 блок, хотя это будет выглядеть как идеальное место для этого.

Другие вопросы по тегам