Подтвердить что ты не робот

Переключатель без перерыва

У меня есть оператор switch, как показано ниже. Обратите внимание, что нет перерыва. Findbugs сообщает об ошибке только во втором случае. Ошибка: оператор switch, найденный там, где один случай проходит до следующего случая.

switch(x) {

    case 0:
        // code

    case 1:
        // code

    case 2:
        // code
}
4b9b3361

Ответ 1

Findbugs помечает, что прохождение через один case к следующему обычно не является хорошей идеей, если в первом есть какой-либо код (хотя иногда его можно использовать для хорошего эффекта). Поэтому, когда он видит второй case и no break, он сообщает об ошибке.

Итак, например:

switch (foo) {
    case 0:
        doSomething();
    case 1:
        doSomethingElse();
    default:
        doSomeOtherThing();
}

Это вполне допустимая Java, но она, вероятно, не делает то, что автор намеревался: Если foo есть 0, все три функции doSomething, doSomethingElse и doSomeOtherThing запускаются (в этот заказ). Если foo - 1, запускаются только doSomethingElse и doSomeOtherThing. Если foo - любое другое значение, выполняется только doSomeOtherThing.

Напротив:

switch (foo) {
    case 0:
        doSomething();
        break;
    case 1:
        doSomethingElse();
        break;
    default:
        doSomeOtherThing();
        break;
}

Здесь будет выполняться только одна из функций в зависимости от значения foo.

Так как это общая ошибка кодирования, чтобы забыть break, инструменты, такие как Findbugs, отмечают это для вас.

В общем случае используется несколько операторов case в строке без промежуточного кода:

switch (foo) {
    case 0:
    case 1:
        doSomething();
        break;
    case 2:
        doSomethingElse();
        break;
    default:
        doSomeOtherThing();
        break;
}

Здесь мы хотим называть doSomething, если foo 0 или 1. Большинство инструментов не будут отмечать это как возможную ошибку кодирования, потому что там нет кода в case 0 до case 1, и это довольно распространенный шаблон.

Ответ 2

Я написал их как комментарии, но потом это не видно. Я превращаю их в ответ. На самом деле это расширение для ответа T.J.Crowder.

Вы можете найти связанное правило, которое заставляет Findbugs сообщать об ошибке здесь.

Вы можете запретить Findbugs сообщать об этом виде ошибок, создав файл xml со следующим содержимым, скажем filter.xml и запустив инструмент с опцией -exclude filter.xml. См. фильтры в Findbugs.

<FindBugsFilter>
  <Match>
    <Bug category="PERFORMANCE" />
  </Match>
</FindBugsFilter>

Ответ 3

Падение переходов подпадает под категорию "Findbugs" "изящного кода". Я думаю, что это только флаг первого появления провала в инструкции switch, чтобы сократить количество сообщений об ошибках.

Ответ 4

Без разрыва они будут падать друг на друга, поэтому, если x == 0, вы пройдете весь код в каждом блоке оператора case. Findbugs может быть ошибочным в отношении ошибки, или это может быть условие ошибки без разрыва, то есть что-то в case 0 приводит к поломке в case 1.

Без точного кода и ошибки я больше не могу помочь. Является ли отсутствие перерывов преднамеренным?

Ответ 5

Обычно инструменты анализа ошибок не любят проваливаться в коде, потому что в большинстве случаев пользователь просто забыл написать перерыв.

Я не знаю, есть ли способ специально отключить предупреждение с помощью FindBugs, но инструмент Checkstyle распознает специальные комментарии, такие как /* fallthrough */, чтобы предположить, что пользователь действительно хочет выполнить следующий код. Помещение такого комментария также повышает читаемость. http://checkstyle.sourceforge.net/config_coding.html#FallThrough

В коде Java code также упоминается использование провального комментария. http://www.oracle.com/technetwork/java/javase/documentation/codeconventions-142311.html

Ответ 6

Если у ваших случаев нет разрыва, один раз триггерный переключатель будет проходить через все случаи, пока не найдет разрыв или конец дел. Если у вас есть случай по умолчанию, он будет срабатывать, если значение вашего переключателя в этом случае foo не соответствует другим случаям.