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