To make things less trappy, I'm wondering that maybe LeafReader.getPointValues() should never return null.
We could maybe separately consider that? I don't think that would have prevented this particular bug.
I'm generally not really a fan of returning fake empty "should be null but caller can't be trusted" objects though: I think it's a degree of API leniency that if you take it to its limit, never ends, i.e. how deeply do you keep returning null as you dig into the fake object? These are quite expert APIs and I think it's reasonable to expect the caller to be careful with the return result...
Today, a null return from LeafReader.getPointValues is meaningful: it notifies you this segment has no points indexed at all. We would be hiding that information if instead we returned a fake empty object.
Not helping matters, I do realize we are inconsistent here, e.g. LeafReader.fields() is not null even if there were no postings in that segment, yet Fields.terms(String field) is null if the postings didn't have that field.