Foros del Web » Programación para mayores de 30 ;) » Java »

¿cuenta el add(null) como elemento contable?

Estas en el tema de ¿cuenta el add(null) como elemento contable? en el foro de Java en Foros del Web. Hola a todos, estoy un poco confuso. Estoy elaborando un programa en Java, y me han dado varios errores de punteros nulos. Al revisar el ...
  #1 (permalink)  
Antiguo 18/05/2015, 09:38
 
Fecha de Ingreso: mayo-2006
Mensajes: 70
Antigüedad: 17 años, 11 meses
Puntos: 0
¿cuenta el add(null) como elemento contable?

Hola a todos,

estoy un poco confuso. Estoy elaborando un programa en Java, y me han dado varios errores de punteros nulos. Al revisar el código, me he dado cuenta que la mayoría de esos errores se producen en los bucles cuando hago for(i=0;i<a.size();i++), siendo a un array del tipo que sea.

Hice una prueba:

ArrayList<String> a= new ArrayList<String>();
System.out.println("\n tamano test 1"+ a.size());

a.add(null);
System.out.println("\n tamano test 2"+ a.size());

a.add("c");
System.out.println("\n tamano test 3"+ a.size());

me dan valores 0,1 y 2. Siempre he pensando que el valor null, era un valor que se metía para inicializar, pero que no influía en el tamaño del mismo. Es decir, incializo a null para empezar a trabajar con el array (metiendo valores, casos límites etc) pero su tamaño seguía siendo 0, y al meter el primer valor a.add("casa"), por ejemplo, ya contaba como primer valor. Ahora me he dado cuenta de que siempre que hago el for para recorrer el array, me quedo conrto en un valor. ¿No hay alguna forma de hacer que no cuente ese null como elemento? sin que sea quitarlo cuando meta el primer valor del array.

¡Gracias por vuestra atención¡
  #2 (permalink)  
Antiguo 18/05/2015, 09:57
Avatar de Profesor_Falken  
Fecha de Ingreso: agosto-2014
Ubicación: Mountain View
Mensajes: 1.323
Antigüedad: 9 años, 8 meses
Puntos: 182
Respuesta: ¿cuenta el add(null) como elemento contable?

Buenas,

Si quieres filtrar todos los valores 'null' de tu lista lo puedes hacer simplemente con:

Código Java:
Ver original
  1. a.removeAll(Collections.singleton(null));


Un saludo
__________________
If to err is human, then programmers are the most human of us
  #3 (permalink)  
Antiguo 19/05/2015, 08:30
 
Fecha de Ingreso: octubre-2008
Mensajes: 184
Antigüedad: 15 años, 6 meses
Puntos: 1
Respuesta: ¿cuenta el add(null) como elemento contable?

Yo también pensaba que no contaban los null
  #4 (permalink)  
Antiguo 19/05/2015, 08:54
Avatar de Profesor_Falken  
Fecha de Ingreso: agosto-2014
Ubicación: Mountain View
Mensajes: 1.323
Antigüedad: 9 años, 8 meses
Puntos: 182
Respuesta: ¿cuenta el add(null) como elemento contable?

Del JavaDoc de ArrayList. Primera frase:

Resizable-array implementation of the List interface. Implements all optional list operations, and permits all elements, including null.

Un saludo
__________________
If to err is human, then programmers are the most human of us
  #5 (permalink)  
Antiguo 19/05/2015, 21:22
(Desactivado)
 
Fecha de Ingreso: marzo-2012
Mensajes: 366
Antigüedad: 12 años
Puntos: 31
Respuesta: ¿cuenta el add(null) como elemento contable?

En muchas ocasiones necesitas inicializar tus variables para luego trabajar con ellas, por ejemplo cuando la primera acción sobre una variable es una comparación (p.ej en condición en bucle). En ese caso necesitas que tu variable esté inicializada. Sin embargo, no quieres que tenga ningún valor inicial, pues si es un string no quieres que tenga ninguna letra, ni espacio, ni carácter... quieres que esté vacio. Bueno, pues en ese caso se inicializa con el valor null.

De esta manera, cuando tu asignas un valor a esa variable, dicho valor sobre-escribe el valor anterior, y da igual que el valor anterior fuese un null o un valor del tipo que fuese tu variable.

En el caso de listas, arrays, y distintas variables capaces de tener varios valores simultáneamente, pueden ser inicializados a null. En este caso el primer valor que manualmente se añade (incluido un null) será el primer valor que coge, y ocupará una posición.

Sin embargo, cuando es inicializada a null, el primer valor añadido (incluso un null) se añade como primer elemento.

En el ejemplo que tú has puesto has declarado un ArrayList... pero no lo has inicializado. Y sin estar inicializado has añadido un null a la primera posición. Por lo tanto va a ocupar 1 posición.

Cuando un null no ocupa ningún espacio es cuando al declarar la variable es inicializada a null... y después añades otro valor (que también puede ser un null)

ArrayList<String> a=null;
a.add(null)
System.out.println("\n tamano test 1"+ a.size());

En este caso el valor con el que se inicializa (null) es sustituido por el primer valor que le añades. Y a.size()=1 en vez de 2.

Con lo cual llegas a la conclusión de que es distinto inicializar una lista, array, o cualquier variable de almacenamiento de varios valores simultáneos a null... que no inicialziarla y añadir un null.

Por lo cual llegamos también a la conclusión de que el proceso:
Int valor;
valor=0;
Es distinto a:
int valor=0;

Y la diferencia es que en un caso la variable ha sido inicializada y en el otro caso no. No necesitas inicializar una variable para asignarla valores. Pero si que necesitas inicializarla para otro tipo de acciones, como por ejemplo comparar alguna de sus propiedades, o utilizarla en algunos métodos (como por ejemplo pasar a string una variable int sin inicializar... no podrías) o incluso, para comparar esa variable con el valor null necesitas haberla inicializado... con un valor null o con cualquier otro valor.

Última edición por Kritik; 19/05/2015 a las 21:42
  #6 (permalink)  
Antiguo 20/05/2015, 02:39
Avatar de Xerelo  
Fecha de Ingreso: mayo-2009
Mensajes: 2.175
Antigüedad: 14 años, 11 meses
Puntos: 306
Respuesta: ¿cuenta el add(null) como elemento contable?

Cita:
ArrayList<String> a=null;
a.add(null)
System.out.println("\n tamano test 1"+ a.size());

En este caso el valor con el que se inicializa (null) es sustituido por el primer valor que le añades. Y a.size()=1 en vez de 2.
En este caso lo que tienes es un NullPointerException.

Del resto, creo que te montas una caco importante con las inicializaciones

Cita:
Int valor;
valor=0;
Es distinto a:
int valor=0;

Y la diferencia es que en un caso la variable ha sido inicializada y en el otro caso no.
No hay ninguna diferencia.

Sobre la pregunta que abre el hilo,

un ArrayList es un array dinámico, y cuando se crea se le da un "tamaño" que irá variando según el array se va llenando, por lo que siempre hay posiciones vacías en un ArrayList.

Lo que te extraña del comportamiento, es que tienes que diferenciar entre capacidad y tamaño de un ArrayList, la capacidad es ese "tamaño" con el que se crea y que va aumentando, el tamaño es el número de elementos que contiene.

¿Cómo sabe su tamaño? Empieza en 0 y cada vez que haces un add suma uno y con un remove resta uno, por lo que cuanto haces add(null) estás sumando uno, ya que no diferencia si el elemento es null o no.

Hay que tener en cuenta que un List es dinámico, por lo que su prioridad no es acceder a una posición en concreto, tanto con add(indice,elemento) y con remove(indice) todos los índices posteriores se modifican.
__________________
Cada vez que solucionas los problemas de alguien que no se esfuerza, piensa en que el día de mañana puede llegar a ser tu compañero de trabajo, o peor, tu jefe.
  #7 (permalink)  
Antiguo 20/05/2015, 07:04
(Desactivado)
 
Fecha de Ingreso: marzo-2012
Mensajes: 366
Antigüedad: 12 años
Puntos: 31
Respuesta: ¿cuenta el add(null) como elemento contable?

Código:
ArrayList<String> a;
//System.out.println("\n tamano test 1= "+ a.size());//Esta línea EN ESTE MOMENTO provoca NullPointerException
a= new ArrayList<String>();
System.out.println("\n tamano test 1= "+ a.size());
a.add(null);
System.out.println("\n tamano test 2= "+ a.size());

String[] miArray = new String [5];
System.out.println("\n tamano test 3= "+ miArray.length);

String[] miArray2 = null;//Ahora lo creo igual que el ArrayList... pero igualandolo a null
//System.out.println("\n tamano test 4= "+ miArray2.length); //Esta línea EN ESTE MOMENTO provoca NullPointerException
miArray2=new String[5];
System.out.println("\n tamano test 4= "+ miArray2.length);//Ahora esta misma línea no da error.
Copia el código en el editor de java que uses y prueba a activar líneas y desactivarlas.

Última edición por Kritik; 20/05/2015 a las 07:10
  #8 (permalink)  
Antiguo 12/06/2015, 04:39
 
Fecha de Ingreso: mayo-2006
Mensajes: 70
Antigüedad: 17 años, 11 meses
Puntos: 0
Respuesta: ¿cuenta el add(null) como elemento contable?

Hola a todos,
disculpad que haya tardado tanto en responder, pero se me quedó el mensaje en borradores accidentalmente, y hoy que tenía tiempo me puse a mirar la web y me di cuenta.

Comentaros que hice las pruebas y ahora me queda más claro, muchas gracias a todos, pero especialmente a Kritik, dando una respuesta tan clara y profunda, ya que me resolvió las dudas. También, haciendo las pruebas del compañero Kritik, sirve para darse cuenta de lo que comenta más teoricamente en el primer post.

Con esto que comentas solucioné mi problema, así que muchísimas gracias y una vez más disculpa la demora.

Etiquetas: elemento, programa, valor
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 00:07.