aplicacion java guava findbugs

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 la input 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).