And in those cases where you still need specific behaviour based on which object is null, you can still use the . operator with traditional null pointer checks.
var = foo()?.bar?.bing()
if(foo==null){...}
instead of putting a null check between every call. In many cases null is used to indicate that a computation failed. If you are doing a chain of computations, there is often not a reason you need or want to do a check between every computation, instead of having a single handler at the end for if any of them fail.This pattern comes up fairly often in Haskell, which accomplishes it with the Maybe monad.