Тестирование с пустыми и null-списками
В реальной программировании важно учитывать крайние случаи, например, когда список может быть пустым или даже null. Наш текущий метод containsDuplicates хорошо работает для списков с элементами, но что произойдет, если мы передадим пустой список или список со значением null?
Давайте протестируем это, добавив больше примеров в метод main в файле ~/project/DuplicateDetector.java. Откройте файл в редакторе кода и добавьте следующие строки в метод main после существующего кода:
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));
Сохраните файл (Ctrl+S или Cmd+S).
Теперь скомпилируйте и запустите программу снова.
Скомпилируйте:
javac DuplicateDetector.java
Запустите:
java DuplicateDetector
Вы должны увидеть вывод для пустого списка:
List with duplicates: [apple, banana, apple, orange]
Contains duplicates? true
List without duplicates: [grape, mango, kiwi]
Contains duplicates? false
Empty list: []
Contains duplicates? false
Вывод для пустого списка правильный; пустой список не содержит дубликатов.
Однако, если вы раскомментируете строку System.out.println("Contains duplicates? " + containsDuplicates(nullList)); и попытаетесь скомпилировать и запустить программу, вы получите исключение NullPointerException. Это происходит потому, что мы пытаемся создать HashSet из списка со значением null, что не допускается.
Чтобы сделать наш метод containsDuplicates более надежным, мы должны обработать случай, когда входной список имеет значение null. Мы можем добавить проверку в начале метода.
Модифицируйте метод containsDuplicates в файле ~/project/DuplicateDetector.java, чтобы включить проверку на 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();
}
Теперь раскомментируйте строку, которая тестирует список со значением null в методе main:
List<String> nullList = null;
System.out.println("\nNull list: " + nullList);
System.out.println("Contains duplicates? " + containsDuplicates(nullList)); // Expected: false
Сохраните файл (Ctrl+S или Cmd+S).
Скомпилируйте и запустите программу в последний раз.
Скомпилируйте:
javac DuplicateDetector.java
Запустите:
java DuplicateDetector
Теперь вывод должен включать результат для списка со значением null без сбоя программы:
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
Добавив проверку на null, наш метод containsDuplicates стал более надежным и может корректно обрабатывать входные данные со значением null. Это важная практика в программировании для предотвращения непредвиденных ошибок.