Así que estoy haciendo un tipo de programa de servidor de correo para mi curso de Java (me llamaría un principiante en Java) y aunque he completado todas las partes requeridas, hay algunos problemas con el programa que, si bien la tarea no lo requiere , Me gustaría saber por qué esto se está comportando de la manera y cómo solucionarlo. Entonces, para resumir, tengo dos métodos que verifican cuántos elementos de correo tiene un usuario específico y otro que devuelve el elemento de correo que está primero en el buzón de correo de los usuarios (según la regla LIFO).

Entonces, si un usuario A.Tiene un buzón y B.Tiene al menos 1 correo en dicho buzón, no hay problema, esto realmente no funciona cuando a y / o b no son verdaderas. Y eso es lo que intenté arreglar. Pensé que sería tan simple como verificar si el mailbox.containsKey (quién) == falso y / o el buzón.get (quién) .get (0) == null sería suficiente, pero cuando hago esto obtengo java. lang.IndexOutOfBoundsException: Índice: 0, Tamaño: 0.

Intenté varios tipos de verificación si es == verdadero / falso nulo, etc. Intenté lanzar la excepción todos juntos, pero nada parece funcionar y, aunque tal vez lanzar la excepción podría funcionar de alguna manera que me gustaría para resolverlo de otra manera, ya que el comando de lanzamiento parece un poco vago

Aquí está mi método en el que verifico tanto A como B:

private boolean errorHandling(String who){  
    if (mailbox.containsKey(who)==false ||  mailbox.get(who).get(0) == null    ){ 
        return true;  
    }
    else{
        return false;
    }
}

Y este método es utilizado por estos dos métodos:

public MailItem getNextMailItem(String who)
{
    if (!errorHandling(who) ){   
        MailItem item2 = mailbox.get(who).get(0);
        mailbox.get(who).remove(0);
        return item2;
    } else{
        System.out.println("that user dosent have a mailbox");
        return null;
    }
}

public int howManyMailItems(String who)
{
    if (!errorHandling(who) ){  //To check if user has a mailbox
        return mailbox.get(who).size();
    }
    else{
        System.out.println("that user dosent have a mailbox");
        return 0;
    }
}  

No estoy seguro de si necesita más de mi código para ayudarme o no. Dime si ese es el caso, pero para aclarar, el "buzón" es el hashmap y el parámetro who es la persona que quieres que revise su buzón. Gracias.

2
DJ Oakman 4 oct. 2019 a las 19:37

1 respuesta

La mejor respuesta

Hay un par de problemas en nuestro código que enumero a continuación

Primer problema

La condición if es incorrecta y será verdadera incluso si el mapa no contiene la clave

if (mailbox.containsKey(who)==false ||  mailbox.get(who).get(0) == null)

  // mailbox.containsKey(who) will return false if map doesn't contain key
  // then false==false ---> always true

Por lo tanto, está devolviendo verdadero, incluso la clave no está presente en el mapa y no es necesario el método errorHandling. puedes usar containsKey

if (containsKey(who) ){      // if key exists then proceed
   MailItem item2 = mailbox.get(who).get(0);
   mailbox.get(who).remove(0);
   return item2; }
else{                   // else don't proceed 
    System.out.println("that user dosent have a mailbox");
    return null;
}

Incluso puede evitar esta condición `if utilizando getOrDefault

default V getOrDefault(Object key, V defaultValue)

Segundo problema

La segunda parte de la condición if es incorrecta mailbox.get(who).get(0) == null es posible que tenga una lista vacía para esa clave, por lo que puede refactorizar su código como se muestra a continuación

List<MailItem> listItem = mailbox.get(who, new ArraysList<>());  //get list if key exists or else get empty list

 if(!listItems.isEmpty()) {
      return listItems.remove(0);    //if list has items delete at index 0
   }
 else{
    System.out.println("that user dosent have a mailbox");
    return null;
  }
1
Deadpool 4 oct. 2019 a las 16:56