@Nullable input in Google Guava Function interface wyzwala Ostrzeżenie FindBugs

Interfejs com.google.common.base.Function (z Google Guava) definiuje apply jako:

@Nullable T apply(@Nullable F input);

Metoda ma następującą notatkę javadoc:

@throws NullPointerException if {@code input} is null and this function does not accept null arguments.

FindBugs narzeka na moją implementację funkcji:

private static final class Example implements Function<MyBean, String> {
    @Override
    @Nullable
    public String apply(@Nullable MyBean input) {
        if (null == input) {
            throw new NullPointerException();
        }
        return input.field;
    }
}

Z wysokim priorytetem Ostrzeżenie:

NP_PARAMETER_MUST_BE_NONNULL_BUT_MARKED_AS_NULLABLE, priorytet: High

Wejście musi być nonnull, ale jest oznaczone jako nullable

Parametr ten jest zawsze używany w sposób wymaga to, aby był nonnull, ale parametr jest wyraźnie przypisany jako Nullable. Albo użycie parametru, albo adnotacja jest błędna.

My function does not support null inputs and an exception is thrown if that is the case. Jeśli dobrze rozumiem, FindBugs traktuje to jako wymóg non-null.

Dla mnie wygląda to jak sprzeczność: input to @Nullable, ale method @rzuca NullPointerException, gdy jest null. Coś przeoczyłem?

Jedynym sposobem na pozbycie się ostrzeżenia, które widzę, jest ręczne tłumienie. (Kod Guava jest poza moją kontrolą, oczywiście).

Kto się myli co do używania adnotacji @ Nullable, FindBugs, Guava czy mnie?

Author: vitaly, 2012-09-14

3 answers

Twoja implementacja jest błędna;)

Zasadniczo docs mówi (parafrazuję i podkreślam):

@throws NullPointerException Jeśli input jest null i Beton implementacja funkcji nie akceptuje argumentów null

Implementując swoją funkcję musisz zdecydować czy akceptuje ona null czy nie. W pierwszym przypadku:

private static final class Example implements Function<MyBean, String> {
    @Override
    @Nullable
    public String apply(@Nullable MyBean input) {
        return input == null ? null : input.field;
    }
}

W drugim przypadku:

private static final class Example implements Function<MyBean, String> {
    @Override
    @Nullable
    public String apply(MyBean input) {
        if (null == input) {
            throw new NullPointerException();
        }
        return input.field;
    }
}

W obu przykładach dozwolone jest zwracanie null.

EDIT:

Uwaga to, że Guava używa @javax.annotation.ParametersAreNonnullByDefault na wszystkich pakietach, stąd Jeśli @Nullable jest obecny, oznacza to "zawieś globalny @Nonnull i pozwól null tutaj", a jeśli nie oznacza to "zakaz null tutaj".

To powiedziawszy, możesz użyć @Nonnull adnotacji na argumencie lub @ParametersAreNonnullByDefault w pakiecie, aby powiedzieć, że argument funkcji FindBugs nie może być null.

Edytuj 2:

Okazuje się, że ta sprawa jest znana , patrz komentarz #3 (od głównego dev Kevin Bourrillion, o jego rozmowie z Billem "Ołów Findbugs"): {]}

Moja Referencja była serią osobistych rozmów z Billem Pughem. Twierdził jednoznacznie, że @Nullable oznacza tylko, że niektóre podtypy może zaakceptować null. I wydaje się, że jest to potwierdzone przez findbugs dla nas - nasz kod przechodzi kontrolę nullability całkiem czysto (chociaż my należy sprawdzić ponownie, ponieważ ta konkretna zmiana funkcji została dokonana).
 28
Author: Xaerxess,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-09-14 15:05:16

Oznaczenie parametru @Nonnull rozwiązuje problem z findbugs.

 3
Author: Balamurugan Muthiah,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-02-04 10:45:13

Wygląda na to, że domyślnie funkcje Google Guava są @Nullable domyślnie-otrzymywałem błędy Findbugs stwierdzające, że" wynik musi być nonnull, ale jest oznaczony jako nullable", gdy nie było adnotacji. Dodanie @Nonnull do deklaracji funkcji w następujący sposób pomogło:

new Function<Object, Object>() {
            @Nonnull
            public Object apply(@Nonnull Object object) {
A teraz Findbugs jest szczęśliwy. Thanks all
 0
Author: Ben Thomas,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-07-28 09:39:54