2011-04-14 16 views
6

Suponiendo que tengo una ArrayList de ArrayLists creados de esta forma:¿ArrayList.clear() también elimina todos los objetos contenidos?

ArrayList< ArrayList<String> > listOfListsOfStrings = 
           new ArrayList< ArrayList<String> >(); 

Si llamo:

listOfListsOfStrings.clear(); 

Será un intento de acceder posteriormente a cualquiera de las cuerdas dentro listOfListsOfStringssiempre resultado en una java.lang.NullPointerException?

+1

Pruébalo y mira lo que sucede. Si no funciona como espera, publique su código de demostración que muestra el problema. Como puede ver, la respuesta es NO, no causará una excepción. Por lo tanto, si recibe una excepción, significa que tiene un problema de codificación y no está más avanzado al hacer una pregunta "¿y si?". Es por eso que siempre debes intentarlo tú mismo. Debería tener menos de 10 líneas de código. – camickr

Respuesta

3

No, solo se borrarán las referencias. Si ya no existe ninguna referencia a un objeto, podría ser basura recolectada, pero no obtendría NPE, ya que de todas formas no tiene forma de obtener una nueva referencia a ese objeto.

+0

Gracias. Tu respuesta me ayudó a encontrar esta increíble respuesta que me ayudó a encontrar la fuente de un error que me estaba volviendo loco: http://stackoverflow.com/questions/333151/java-how-to-pass-byte-by-reference/333217 # 333217 Resulta que en Java no puedo pasar una referencia a una referencia ... Así que cuando pasé un parámetro ArrayList a un método de superclase para llenar, en realidad estaba llenando una matriz diferente ... Todo está bien ahora . – an00b

+0

Y este artículo puede ayudar a futuros n00bs como yo: http://javadude.com/articles/passbyvalue.htm – an00b

+0

De nada :) Como nodo lateral, aunque Java es pasaje por valor, lo que realmente es pasado si usa objetos como parámetros es la referencia. Por lo tanto, puede pasar un objeto al método y modificarlo allí, pero no puede crear el objeto dentro de asignarlo a la referencia aprobada. En términos de C/C++ pasaría un puntero a un objeto por valor. - Una posibilidad para reducir esos errores o hacer que el compilador lo ayude sería marcar todos los parámetros como finales (Eclipse puede hacerlo automáticamente). Si luego asigna un valor diferente a un parámetro, el compilador se quejaría. – Thomas

1

No, no eliminará objetos en el ArrayList si aún tiene referencias externas sobre ellos. ArrayList.clear() no hace nada a los objetos a los que se hace referencia a menos que sean huérfanos, en cuyo caso no se referirá a ellos más adelante.

Cuestiones relacionadas