java - aplicacion - La entrada @Nullable en la interfaz de la Función Google Guava activa la advertencia FindBugs
id de aplicacion android (3)
Marcar el parámetro @Nonnull
resuelve el problema de findbugs.
La interfaz com.google.common.base.Function
(de Google Guava ) define apply
como:
@Nullable T apply(@Nullable F input);
El método tiene la siguiente nota de javadoc:
@throws NullPointerException if {@code input} is null and this function does not accept null arguments
.
FindBugs se queja de mi implementación de la función:
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;
}
}
con una advertencia de alta prioridad :
NP_PARAMETER_MUST_BE_NONNULL_BUT_MARKED_AS_NULLABLE, Prioridad: Alta
la entrada debe ser no nula, pero está marcada como nulable
Este parámetro siempre se usa de una manera que requiere que sea no nulo, pero el parámetro se anota explícitamente como anulable. O el uso del parámetro o la anotación es incorrecto.
Mi función no admite entradas null
y se lanza una excepción si ese es el caso. Si entiendo correctamente, FindBugs lo trata como un requisito para no nulo.
Para mí, parece una contradicción: la entrada es @Nullable pero el método @throws NullPointerException cuando es nulo. ¿Me estoy perdiendo de algo?
La única forma de eliminar la advertencia que puedo ver es la supresión manual. (El código de guayaba está fuera de mi control, obviamente).
¿Quién está equivocado sobre el uso de la anotación @Nullable, FindBugs, Guava o yo?
Parece que, por defecto, las funciones de Google Guava son @Nullable de forma predeterminada - Obtuve errores de Findbugs que indicaban que "el resultado debe ser no nulo, pero está marcado como nulo" cuando no había ninguna anotación. Agregar @Nonnull a la declaración de función de la siguiente manera ayudó:
new Function<Object, Object>() {
@Nonnull
public Object apply(@Nonnull Object object) {
y ahora Findbugs está feliz. Gracias a todos
Tu implementación es incorrecta;)
Básicamente, los documentos dicen (voy a parafrasear y enfatizar):
@throws NullPointerException
si lainput
es nula y la implementación de la función concreta no acepta argumentos nulos
Al implementar su función, debe decidir si acepta nulos o no. En primer caso:
private static final class Example implements Function<MyBean, String> {
@Override
@Nullable
public String apply(@Nullable MyBean input) {
return input == null ? null : input.field;
}
}
En el segundo caso:
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;
}
}
En ambos ejemplos está permitido devolver nulo.
EDITAR:
Tenga en cuenta que Guava utiliza @javax.annotation.ParametersAreNonnullByDefault
en todos los paquetes, por lo tanto, si @Nullable
está presente, significa "suspender global @Nonnull
y permitir nulos aquí" y si no significa "nulos prohibidos aquí".
Dicho esto, es posible que desee utilizar la anotación @Nonnull
en su argumento o @ParametersAreNonnullByDefault
en el paquete para indicarle a FindBugs que el argumento de la función no puede ser nulo.
EDICION 2:
Resulta que este caso es un problema conocido , vea el comentario n. ° 3 (del principal desarrollador de Guava, Kevin Bourrillion, sobre su conversación con Bill Pugh, líder de Findbugs):
Mi referencia fue una serie de conversaciones en persona con Bill Pugh. Afirmó inequívocamente que
@Nullable
significa solo que algunos subtipos podrían aceptar nulo. Y esto parece corroborado por findbugs para nosotros: nuestro código pasa las comprobaciones de nullability bastante limpiamente (aunque deberíamos volver a verificarlo desde que se realizó este cambio de Función en particular).