Probar con listas nulas y vacías
En la programación del mundo real, es importante considerar casos extremos, como cuando una lista puede estar vacía o incluso ser null. Nuestro método containsDuplicates actual funciona bien para listas con elementos, pero ¿qué pasa si pasamos una lista vacía o una lista null?
Probemos esto agregando más ejemplos a nuestro método main en ~/project/DuplicateDetector.java. Abre el archivo en el Editor de Código y agrega las siguientes líneas al método main, después del código existente:
System.out.println("\nEmpty list: " + new ArrayList<>());
System.out.println("Contains duplicates? " + containsDuplicates(new ArrayList<>())); // Expected: false
List<String> nullList = null;
System.out.println("\nNull list: " + nullList);
// The following line will cause a NullPointerException if not handled
// System.out.println("Contains duplicates? " + containsDuplicates(nullList));
Guarda el archivo (Ctrl+S o Cmd+S).
Ahora, compila y ejecuta el programa nuevamente.
Compila:
javac DuplicateDetector.java
Ejecuta:
java DuplicateDetector
Deberías ver la salida para la lista vacía:
List with duplicates: [apple, banana, apple, orange]
Contains duplicates? true
List without duplicates: [grape, mango, kiwi]
Contains duplicates? false
Empty list: []
Contains duplicates? false
La salida para la lista vacía es correcta; una lista vacía no contiene duplicados.
Sin embargo, si descomentas la línea System.out.println("Contains duplicates? " + containsDuplicates(nullList)); y intentas compilar y ejecutar, obtendrás una NullPointerException. Esto sucede porque estamos intentando crear un HashSet a partir de una lista null, lo cual no está permitido.
Para hacer que nuestro método containsDuplicates sea más robusto, debemos manejar el caso en el que la lista de entrada sea null. Podemos agregar una comprobación al principio del método.
Modifica el método containsDuplicates en ~/project/DuplicateDetector.java para incluir una comprobación de null:
public static boolean containsDuplicates(List<String> list) {
// Handle null input
if (list == null) {
return false; // A null list does not contain duplicates
}
// Create a HashSet from the list
Set<String> uniqueElements = new HashSet<>(list);
// Compare the size of the list with the size of the HashSet
return list.size() != uniqueElements.size();
}
Ahora, descomenta la línea que prueba la lista null en el método main:
List<String> nullList = null;
System.out.println("\nNull list: " + nullList);
System.out.println("Contains duplicates? " + containsDuplicates(nullList)); // Expected: false
Guarda el archivo (Ctrl+S o Cmd+S).
Compila y ejecuta el programa una última vez.
Compila:
javac DuplicateDetector.java
Ejecuta:
java DuplicateDetector
La salida ahora debe incluir el resultado para la lista null sin que se produzca un error:
List with duplicates: [apple, banana, apple, orange]
Contains duplicates? true
List without duplicates: [grape, mango, kiwi]
Contains duplicates? false
Empty list: []
Contains duplicates? false
Null list: null
Contains duplicates? false
Al agregar la comprobación de null, nuestro método containsDuplicates es ahora más robusto y puede manejar entradas null de manera adecuada. Esta es una práctica importante en la programación para evitar errores inesperados.