Просматривая статистику использования правил на Techdebt.org, я с удивлением обнаружил критические правила PMD, которые, похоже, игнорируются. Вот презентация 5 из них с объяснением того, что они проверяют. У всех этих правил есть две общие черты:
- Их неуважение может привести к огромным проблемам в вашем приложении;
- Статистика их использования на удивление низкая.
Для каждого правила вы также найдете статистику его использования (процент проекта, в котором используется правило, в соответствии с Techdebt.org) и набор правил PMD, где вы можете найти правило. Вы можете не узнать ничего нового, но не забудьте проверить свой профиль качества, чтобы убедиться, что вы используете их
ReturnFromFinallyBlock
| Использование: 7,75% | Набор правил PMD: базовый |
Это правило находит возвращение в блоках finally . Это определенно критическая ошибка, поскольку она может отбрасывать исключения. Если исключение, отмеченное или не отмеченное, выбрасывается в блок try, возвращение в блоке finally отклоняет его.
Пример: следующий код печатает только «Наконец».
public static void main(final String[] args) {
try {
foo();
}
catch (final Exception e) {
System.out.println("Catch");
}
}
public static int foo() throws Exception {
try {
// some clever code that throws an Exception
throw new Exception();
}
finally {
System.out.println("Finally");
return -1;
}
}
DoNotThrowExceptionInFinally
| Использование: 7,51% | Набор правил PMD: строгие исключения |
Создание исключения в блоке finally может привести к путанице и затруднить отладку кода. Это также отменит любое предыдущее исключение. Например, если неожиданное исключение, такое как NullPointerException , генерируется в блоке try , оно будет отброшено. Это может скрывать ошибки, что приводит к болезненным задачам отладки …
Пример: следующий код выводит «Gotcha!» когда вы хотите, чтобы он потерпел крах с NPE.
public static void main(final String[] args) {
try {
foo();
}
catch (final IOException e) {
System.out.println("Gotcha!");
}
}
public static void foo() throws IOException {
try {
// some clever code...
// unexpected exception
throw new NullPointerException();
}
finally {
// do something
// throw IOException, the NullPointerException is discarded.
throw new IOException();
}
}
DontCallThreadRun
| Использование: 1,08% | Набор правил PMD: базовый |
Метод run () выполняется в текущем потоке. Чтобы создать новый поток, должен использоваться метод start () , который обычно является предполагаемым поведением. Это правило также присутствует в Findbugs с именем «RU_INVOKE_RUN» . Одно из этих правил должно быть активировано.
Пример: этот код иллюстрирует поведение thread.run () и thread.start ().
public static void main(final String[] args) {
System.out.println("Main thread: " + Thread.currentThread().getId());
final FooThread thread = new FooThread();
thread.run();
thread.start();
}
public static class FooThread extends Thread
{
@Override
public void run() {
System.out.println("I'm executing from thread " + Thread.currentThread().getId());
super.run();
}
}
AvoidStringBufferField
| Использование: 7,51% | Набор правил PMD: String и StringBuffer |
Следует избегать использования StringBuffer в качестве поля класса. StringBuffer может использовать много памяти. Если класс имеет длительный срок службы, это может привести к переполнению памяти. Пока это возможно, предпочитайте использовать локальные переменные.
Пример: не делай этого
public class ExampleClass
{
private StringBuffer output;
FinalizeShouldBeProtected
| Использование: 7,57% | Набор правил PMD: Финализатор |
Finalize () вызывается сборщиком мусора, когда объект собирается. Вы не должны полагаться на завершение для выполнения задач, кроме освобождения ресурсов. Finalize не предназначен для вызова кем-либо, кроме сборщика мусора. По этой причине finalize () должен быть не публичным, а защищенным. Это правило также есть в Findbugs с именем «FI_PUBLIC_SHOULD_BE_PROTECTED» . По крайней мере, одно из этого правила должно быть использовано.
Пример: опять же, не делайте этого
@Override
public void finalize() throws Throwable {
...
}
Это конец этой статьи, как мы видели, нарушение этих правил может принести некоторые проблемы. Я был удивлен, увидев, что они используются редко, поэтому скажите мне: вы знали об этих правилах? Как вы думаете, стоит проверить?
