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

Duda conceptual sobre declaraciones de objetos

Estas en el tema de Duda conceptual sobre declaraciones de objetos en el foro de Java en Foros del Web. Hola, me pasa muy seguido que tengo errores al acceder a objetos declarados en la misma clase. En este caso, puedo usar el ArrayList desde ...
  #1 (permalink)  
Antiguo 22/03/2016, 05:13
 
Fecha de Ingreso: noviembre-2014
Mensajes: 17
Antigüedad: 10 años
Puntos: 0
Duda conceptual sobre declaraciones de objetos

Hola, me pasa muy seguido que tengo errores al acceder a objetos declarados en la misma clase.
En este caso, puedo usar el ArrayList desde el if, pero en el else if me da error me dice que solo puede ser null

Código:
	public static void main(String[] str) throws IOException {
		inetAddress = InetAddress.getByName("localhost");
		TFTPProtocol tftp = new TFTPProtocol();

		// creamos un buffer donde guardar los bytes del datagrampacket
		byte[] b = new byte[516];
				
		DatagramSocket socket = new DatagramSocket(5000);
		int contador = 1;
		
		
		while (true) {
			
			DatagramPacket p = new DatagramPacket(b, b.length);
			socket.receive(p);
			
			// recibimos un paquete i extraemos datos
			byte[] data = p.getData();
			
			ArrayList<DatagramPacket> envioPaquetes = null;
			
			
			if (tftp.catalogarPaquete(data) == RRQ) {
				System.out.println("server: llego un rrq!");
				
				String fileName = tftp.desempaquetarRRQyWRQ(data);
				System.out.println("server:" +fileName);
				envioPaquetes = new ArrayList<DatagramPacket>(tftp.generarPaquetes(ruta+fileName));
				
				System.out.println("server: enviaremos "+envioPaquetes.size()+" paquetes");
				socket.send(envioPaquetes.get(contador));
				envioPaquetes.remove(contador);
				contador++;

			} else if (tftp.catalogarPaquete(data) == WRQ) {
				System.out.println("server: llego un wrq!");
				String fileName = tftp.desempaquetarRRQyWRQ(data);
				System.out.println(fileName);

			} else if (tftp.catalogarPaquete(data) == DATA) {
				System.out.println("server: llego un data!");

			} else if (tftp.catalogarPaquete(data) == ACK_MSG) {
				System.out.println("server: llego un ack del Paquete " + contador + "!!!!");

				socket.send(envioPaquetes.get(contador));
				envioPaquetes.remove(contador);
				contador++;
				
			} else {

			}

		}
  #2 (permalink)  
Antiguo 22/03/2016, 05:35
Avatar de Xerelo  
Fecha de Ingreso: mayo-2009
Mensajes: 2.175
Antigüedad: 15 años, 6 meses
Puntos: 306
Respuesta: Duda conceptual sobre declaraciones de objetos

¿Que sólo puede ser null qué?

Revisa el mensaje de error porque creo que no lo estás leyendo bien.
__________________
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.
  #3 (permalink)  
Antiguo 22/03/2016, 05:54
 
Fecha de Ingreso: noviembre-2014
Mensajes: 17
Antigüedad: 10 años
Puntos: 0
Respuesta: Duda conceptual sobre declaraciones de objetos

UPDATE:
ahora me da null pointer (del arraylist) en el primer if.

Exception in thread "main" java.lang.NullPointerException
at java.net.DatagramSocket.send(Unknown Source)


Que diferencia hay entre:
Código:
ArrayList<DatagramPacket> envioPaquetes = null;

envioPaquetes = new ArrayList<DatagramPacket>(tftp.generarPaquetes(ruta+fileName));
y
Código:
ArrayList<DatagramPacket> envioPaquetes =new ArrayList<DatagramPacket>();
envioPaquetes = tftp.generarPaquetes(ruta+fileName);
Gracias.
  #4 (permalink)  
Antiguo 22/03/2016, 08:00
Avatar de Xerelo  
Fecha de Ingreso: mayo-2009
Mensajes: 2.175
Antigüedad: 15 años, 6 meses
Puntos: 306
Respuesta: Duda conceptual sobre declaraciones de objetos

Mucha

https://docs.oracle.com/javase/7/doc...til.Collection)

Cita:
ArrayList
public ArrayList(Collection<? extends E> c)
Constructs a list containing the elements of the specified collection, in the order they are returned by the collection's iterator.
Parameters:
c - the collection whose elements are to be placed into this list
Throws:
NullPointerException - if the specified collection is null
En la primera usas un list(tftp.generarPaquetes) para crear otro list, si es null te dará nullpointerexception.

En la segunda asignas un list(tftp.generarPaquetes) a una referencia, da igual si es o no null.
__________________
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.
  #5 (permalink)  
Antiguo 22/03/2016, 08:51
Avatar de Malenko
Moderador
 
Fecha de Ingreso: enero-2008
Mensajes: 5.323
Antigüedad: 16 años, 10 meses
Puntos: 606
Respuesta: Duda conceptual sobre declaraciones de objetos

Como "optimización", yo guardaría el resultado de hacer

Código:
tftp.catalogarPaquete(data)
en una variable. Y luego usaría un switch. Piensa que en cada if estás volviendo a ejecutar el método para evaluar el resultado.
__________________
Aviso: No se resuelven dudas por MP!
  #6 (permalink)  
Antiguo 22/03/2016, 09:08
 
Fecha de Ingreso: noviembre-2014
Mensajes: 17
Antigüedad: 10 años
Puntos: 0
Respuesta: Duda conceptual sobre declaraciones de objetos

Entonces, el metodo "generarPaquetes" me devuelve un ArrayList<DatagramPacket>, cuál de las dos maneras uso para guardarlo? no me quedó claro.
Me gustó tu propuesta Malenko de usar switch :), ya lo cambie.

Etiquetas: concepto, declaracion, variables
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 12:00.