Действительна ли эта ошибка разыменования нулевого указателя FindBugs для класса спецификации Spring-Data? - PullRequest
0 голосов
/ 06 августа 2020

Я получаю "Possible null pointer dereference due to return value of called method" ошибку FindBugs в следующей строке.

Specification spec = Specification.where(idSpec).and(nameSpec)
    .and(typeSpec).and(statusSpec);

Спецификация - это класс JPA данных Spring. Некоторые из его фрагментов:

    @Nullable
    static <T> Specification<T> where(@Nullable Specification<T> spec) {
        return spec == null ? (root, query, builder) -> null : spec;
    }

    @Nullable
    default Specification<T> and(@Nullable Specification<T> other) {
        return composed(this, other, (builder, left, rhs) -> builder.and(left, rhs));
    }

Это действительная ошибка FindBugs? Как это исправить?

Как мне избежать нулевых проверок при каждом вызове where и and? Таким образом, такие проверки на null уменьшат читаемость кода, который в настоящее время читается так же, как запрос с использованием цепочки методов.

1 Ответ

1 голос
/ 07 августа 2020

Это допустимая ошибка FindBugs?

Да, это так.

Как исправить?

Добавить проверяет null или сообщает FindBugs, чтобы он был тихим.

Как мне избежать null проверок при каждом вызове where и and? Таким образом, такие проверки на null уменьшат читаемость кода, который в настоящее время читается так же, как запрос с использованием цепочки методов.

Для этого нет пули magi c. Вам необходимо выполнить одно из следующих действий:

  • добавить уродливые нулевые проверки или
  • закодировать собственную замену 1 для Specification, где аргументы и результаты не Nullable или
  • по отдельности подавить любые потенциальные ошибки, обнаруженные FindBugs, которые, как вы «знаете», не являются настоящими ошибками, или
  • полностью отключить эту проверку.

Обратите внимание, что если вы подавите проверку Findbugs, которая является фактической ошибкой, вы можете получить NPE во время выполнения. Таким образом, вы должны будете использовать другие методы для поиска любых (реальных) ошибок в вашем приложении, которые могут привести к NPE. Например, более подробные модульные и системные тесты.

1 - я не уверен, возможно ли это технически, но вы можете иметь возможность писать подклассы Specification и друзей, а затем изменить свой код, чтобы использовать их вместо оригиналы. У этого будут недостатки ...

...