@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?
3 answers
Twoja implementacja jest błędna;)
Zasadniczo docs mówi (parafrazuję i podkreślam):
@throws NullPointerException
Jeśliinput
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).
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.
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 allWarning: 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