Null references are a mistake because they allow non-sensical code:
foo = null
foo.bar()
There are alternatives, if you leverage the type system:
Maybe<Foo> foo = null
foo.bar() // error{Maybe<Foo> does not have any bar method}
Maybe<Foo> foo = null
foo.bar() // error{Maybe<Foo> does not have any bar method}
The generally idea is to put the variable in a box, and the only thing you can do is unboxing it, preferably enlisting the compiler help like proposed for Eiffel.
Haskell has it from scratch (Maybe), in C++ you can leverage boost::optional<T> but you can still get undefined behaviour...