null
。如果它包含null
,那么当不再清楚null
来自何处时,这将导致后续出现空指针异常。因此,我想验证输入。天真的方法是:public void doSomething(Collection<?> collection) {
if (collection.contains(null))
throw new IllegalArgumentException("collection cannot contain null!");
// do something
}
然而,如果集合不支持 null
值,Collection.contains
可能会抛出 NullPointerException。事实上,Java 自己的不可变集合就是这样做的。因此,在朴素的方法中,以下代码将不起作用:
doSomething(List.of("a", "b", "c")); // NullPointerException!
有几种可能的解决方案,但没有一种感觉是正确的。
例如,我可以自己搜索null
:
public void doSomething(Collection<?> collection) {
for (var e : collection) {
if (e == null)
throw new IllegalArgumentException("collection cannot contain null!");
}
// do something
}
但是现在我正在进行线性搜索,尽管该集合可能是一个 HashSet 或 TreeSet,这会提供更好的性能。
或者我可以捕捉 NullPointerException 异常:
public void doSomething(Collection<?> collection) {
try {
if (collection.contains(null))
throw new IllegalArgumentException("collection cannot contain null!");
} catch (NullPointerException e) {
// Apparently, collection doesn't support null. This is good!
}
// do something
}
但这感觉非常不安全。我真的能确定那个NullPointerException是由于集合不支持null引起的,还是我只是吞掉了一个可以提供有关错误信息的异常?
有没有一种好的方法来确定集合是否包含null
?
IllegalArgumentException
比内在告诉我们问题是null
的NullPointerException
更好? - Holger