2010-06-29 7 views
7

De acuerdo con la documentation, List.contains puede lanzar NullPointerException en este escenario:¿Hay clases de recopilación JAVA nativas que extienden la lista que no permite elementos nulos?

"si el elemento especificado es nulo y esta lista no admite nulos elementos (opcional)."

Solo estaba tratando de pensar en una implementación de lista que no permita nulos, y no tengo conocimiento de ninguna. Por ejemplo, puedo tener ArrayList<Double>, pero permite nulos.

List<Double> list = new ArrayList<Double>(); 
    if (list.contains(null)) { // this won't throw NPE    
    } 

Así es la documentación aquí en referencia a implementaciones personalizadas de esta interfaz, o hay algunas clases de colección nativos de Java que se extienden List que no permiten elementos nulos? Me doy cuenta de que la excepción es opcional, solo estaba tratando de pensar en un caso del mundo real donde esto podría ocurrir.

Respuesta

5

No todas las implementaciones de la Lista < ...> permiten que los elementos sean nulos.

Un ejemplo es RoleList::add(role) que arroja una excepción al agregar un valor Nulo.

Esta documentación lo prepara para tal encuentro, lo alienta a consultar la documentación de la lista con la que está trabajando para ver si es una inquietud o a ser precavido si no puede verificarlo. Rastrear NPE no es divertido. Conocer la documentación (siempre que exista una buena documentación) puede salvar muchos dolores de cabeza.

+0

Gracias por la respuesta y el ejemplo. Gracias a todos por sus respuestas también, fueron útiles, solo me gustó la forma en que esta respuesta explicó las cosas de manera sucinta. – dcp

+0

Irónicamente, no lanza 'NullPointerException' sino' IllegalArgumentException'. Pero el punto sigue siendo: es un recordatorio de que no puedes simplemente asumir que null está permitido. – corsiKa

5

Se refiere a las implementaciones personalizadas, hasta el día en que una de las implementaciones de la Lista de Java no permite la nulidad, y luego se referirá a eso también.

1

--- Mensaje editado en respuesta a los comentarios ---

Básicamente, la razón es que hay que recordarle que debe coger el NullPointerExcepton porque los diseñadores de la interfaz List previeron listas que podría informar de cualquier null acceso como una error.

--- --- Post original Sigue

los proporcionados por las bibliotecas estándar de Java soportan nula, pero no hay ninguna restricción en la que la creación de una clase que implementa java.util.List que no soporta null s.

Si la lista no soporta null, a continuación, comprobar que existe una null es equivalente a un error, por lo que la excepción podría tener sentido en función de quién implementado el List. Es por eso que la interfaz debe mencionar la excepción marcada; porque, si no fuera así, no podría lanzar un NullPointerException desde la subclase en caso de que quisiera asegurarse de que nadie tocó la lista con un null.

+0

En realidad, dado que NPE es una RuntimeException, no es necesario declararlo en la firma del método (si fuera así, casi cualquier cosa lo tendría, ya que es una excepción tan común). Lo más probable es que estén diciendo que quieren admitir listas que no permitan valores nulos, y en ese caso si comprueba si contiene un valor nulo arrojará esa excepción intencionalmente, a diferencia de todos los casos de tiempo de ejecución en los que esto podría sucede al intentar acceder a las propiedades de una instancia nula, cuando la VM lo lanza por usted. –

+0

Parece que está diciendo lo mismo al principio, pero parece que la razón principal por la que está allí es para recordarle que verifique NPE porque cualquier código específico de la Lista es más probable que arroje NPE (debido a que aún no se ha especificado la implementación) . –

+1

O posiblemente estén tratando de cubrir para desarrolladores que podrían intentar 'obj.equals' en el argumento pasado en su implementación de List sin verificar si es nulo, y terminarán dando un NPE sin que se den cuenta. :) –

2

GuavaImmutableList no permite nulo, pero devuelve falso en contains(null).

+0

Interesante. Lo mismo ocurre con 'ImmutableSet'. Pero los mapas creados por 'MapMaker' arrojan' NullPointerException' en 'containsKey (null)' – finnw

1

A CheckedList sería un ejemplo de una lista en la API estándar que no admite valores nulos.

Cuestiones relacionadas