Testar com Listas Nulas e Vazias
Na programação do mundo real, é importante considerar casos extremos (edge cases), como quando uma lista pode estar vazia ou até mesmo ser null. Nosso método containsDuplicates atual funciona bem para listas com elementos, mas o que acontece se passarmos uma lista vazia ou uma lista null?
Vamos testar isso adicionando mais exemplos ao nosso método main em ~/project/DuplicateDetector.java. Abra o arquivo no Code Editor e adicione as seguintes linhas ao método main, após o 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));
Salve o arquivo (Ctrl+S ou Cmd+S).
Agora, compile e execute o programa novamente.
Compilar:
javac DuplicateDetector.java
Executar:
java DuplicateDetector
Você deve ver a saída para a lista vazia:
List with duplicates: [apple, banana, apple, orange]
Contains duplicates? true
List without duplicates: [grape, mango, kiwi]
Contains duplicates? false
Empty list: []
Contains duplicates? false
A saída para a lista vazia está correta; uma lista vazia não contém duplicatas.
No entanto, se você descomentar a linha System.out.println("Contains duplicates? " + containsDuplicates(nullList)); e tentar compilar e executar, você obterá um NullPointerException. Isso acontece porque estamos tentando criar um HashSet a partir de uma lista null, o que não é permitido.
Para tornar nosso método containsDuplicates mais robusto, devemos tratar o caso em que a lista de entrada é null. Podemos adicionar uma verificação no início do método.
Modifique o método containsDuplicates em ~/project/DuplicateDetector.java para incluir uma verificação de nulo:
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();
}
Agora, descomente a linha que testa a lista nula no método main:
List<String> nullList = null;
System.out.println("\nNull list: " + nullList);
System.out.println("Contains duplicates? " + containsDuplicates(nullList)); // Expected: false
Salve o arquivo (Ctrl+S ou Cmd+S).
Compile e execute o programa pela última vez.
Compilar:
javac DuplicateDetector.java
Executar:
java DuplicateDetector
A saída agora deve incluir o resultado para a lista nula sem travar:
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
Ao adicionar a verificação de nulo, nosso método containsDuplicates agora é mais robusto e pode lidar com a entrada null de forma adequada. Esta é uma prática importante na programação para evitar erros inesperados.