我已经检查了实现,它是故意这样做的
public void put(E e) throws InterruptedException {
if (e == null) throw new NullPointerException();
这种惊喜对于用户来说并不方便(例如,他想以这种方式用信号通知流的结尾)并打破与集合的一般契约,这很容易接受null元素。 BlockingQueue区分null元素有什么意义?如果空值如此糟糕,我们可能应该根本不使用它们并在JLS中强制执行此低值?
接受空值是 不 的一部分 Collection
合同。的确如此 Collection
的Javadoc 具体说明:
某些集合实现对它们可能包含的元素有限制。例如,某些实现禁止null元素,并且一些实现对其元素的类型有限制。尝试添加不合格的元素会引发未经检查的异常,通常是NullPointerException或ClassCastException。
在很多情况下,添加 null
收集意味着你的程序中有一个错误,而不是你故意把它放进去。例如,Guava库(我参与其中) 做出明确的决定 从许多集合实现中拒绝null,特别是不可变的集合:
我们对Google的内部代码库进行了详尽的研究,结果表明,大约5%的时间内,集合中允许使用null元素,而其他95%的情况最好通过在null上快速失败来实现。
通常有解决方法 做 接受空值,但许多集合实现决定拒绝空值(大多数用户认为有用,因为它可以帮助他们找到错误)并为显式空值适当的罕见情况提供解决方法。
老实说,我认为原因 LinkedBlockingQueue
在这个类别中,当开发原始集合框架时,所有这些都没有被弄清楚,但是在添加并发集合时非常清楚。 Doug Lea,他做了很多工作 util.concurrent
,有人引述说,
Null糟透了。
在最坏的情况下,对象包装器或“毒物对象”始终是有效的解决方法;番石榴提供了一个 Optional
在许多情况下可以发挥作用的类,这是广泛讨论的 这里 在StackOverflow上。
接受空值是 不 的一部分 Collection
合同。的确如此 Collection
的Javadoc 具体说明:
某些集合实现对它们可能包含的元素有限制。例如,某些实现禁止null元素,并且一些实现对其元素的类型有限制。尝试添加不合格的元素会引发未经检查的异常,通常是NullPointerException或ClassCastException。
在很多情况下,添加 null
收集意味着你的程序中有一个错误,而不是你故意把它放进去。例如,Guava库(我参与其中) 做出明确的决定 从许多集合实现中拒绝null,特别是不可变的集合:
我们对Google的内部代码库进行了详尽的研究,结果表明,大约5%的时间内,集合中允许使用null元素,而其他95%的情况最好通过在null上快速失败来实现。
通常有解决方法 做 接受空值,但许多集合实现决定拒绝空值(大多数用户认为有用,因为它可以帮助他们找到错误)并为显式空值适当的罕见情况提供解决方法。
老实说,我认为原因 LinkedBlockingQueue
在这个类别中,当开发原始集合框架时,所有这些都没有被弄清楚,但是在添加并发集合时非常清楚。 Doug Lea,他做了很多工作 util.concurrent
,有人引述说,
Null糟透了。
在最坏的情况下,对象包装器或“毒物对象”始终是有效的解决方法;番石榴提供了一个 Optional
在许多情况下可以发挥作用的类,这是广泛讨论的 这里 在StackOverflow上。