Тестирование с пустыми и нулевыми списками
В реальной программировании важно учитывать крайние случаи, например, когда список может быть пустым или даже 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
. Это важная практика в программировании для предотвращения непредвиденных ошибок.