对空列表和 null 列表进行测试
在实际编程中,考虑边界情况非常重要,例如列表为空甚至为 null
的情况。我们当前的 containsDuplicates
方法对于包含元素的列表效果很好,但如果传入一个空列表或 null
列表会发生什么呢?
让我们通过在 ~/project/DuplicateDetector.java
的 main
方法中添加更多示例来测试这一点。在代码编辑器中打开该文件,并在现有代码之后的 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
。这是因为我们试图从一个 null
列表创建一个 HashSet
,这是不允许的。
为了让我们的 containsDuplicates
方法更健壮,我们应该处理输入列表为 null
的情况。我们可以在方法开始处添加一个检查。
修改 ~/project/DuplicateDetector.java
中的 containsDuplicates
方法,以包含空值检查:
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();
}
现在,取消注释 main
方法中测试 null
列表的行:
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
通过添加空值检查,我们的 containsDuplicates
方法现在更健壮了,可以优雅地处理 null
输入。这是编程中防止意外错误的重要实践。