You are right that if you are sure that you never return zeros, just skip the zero check before calling the method in the first implementation. Similarly, if you need to do something special when UseA() needs to do something different on a null object, you still need to explicitly check the null object. However, which pattern of the null object really helps are situations in which it does not really matter.
Take, for example, most observer patterns. If you implement your observer pattern as a member of your class for which there can be only one observer, and want to tell the observer that your class has done something, it does not matter for the class whether the observer is null or not.
This is also illustrated by empty container classes, which are essentially a null object template. Instead of returning an empty container from the request, you simply return an empty container. For things like iterating through all container entries, it often doesn't matter if it is empty or not, so eliminating the need for zero checking makes the code more convenient and readable. However, if you want to fill out the view of your dataset, you still need to explicitly show different "No records". which checks an empty container.
Edit for clarity.
One problem is only to look at it from the call site. Like most design patterns, this should cover both sides, which should be fully utilized. Consider:
public PossiblyNull GetSomethingNull() { if (someBadSituation()) return null; else return SomehowProduceSomething(); }
against
public PossiblyEmpty GetSomethingEmpty() { if (someBadSituation()) return StaticEmptySomething(); else return ProdueSomethingYay(); }
Now your calling code instead of looking like
public void DoSomethingWithChild(Foo foo) { if (foo != null) { PossiblyNull bar = foo.GetSomething(); if (bar != null) bar.DoSomething(); } }
it could be
public void DoSomethingWithChild(Foo foo) { if (foo != null) foo.GetSomething().DoSomething(); }