Я проверил реализацию, он делает это намеренно
public void put(E e) throws InterruptedException {
if (e == null) throw new NullPointerException();
Этот сюрприз не удобен для пользователя (который хочет передать конец потока таким образом, например) и нарушает общий контракт с коллекциями, которые легко принимают нулевые элементы. Какова точка BlockingQueue для различения нулевых элементов? Если nulls являются настолько плохими, может быть, мы должны воздерживаться от их использования вообще и применять этот минимум в JLS?