PS: To disembiguate I was speaking of the null a value in a nullable type. Maybe I got you wrong.
Also I guess Null is way less a problem in strictly typed language than in JavaScript for instance.
Null values and null pointers aren't fundamentally the same thing, though some programming languages may be implemented in a way such that use of one exposed the other. A language can have a Null value that never results in NPEs.
The problem with nulls isn't strictly null references, in the sense of "a pointer that points to nothing" or "a pointer that throws a null pointer exception", it's that languages with nulls implicitly make null an element of every type. They tend to do this because variables are allowed to have null references, but if you changed the semantics of variables to technically forbid null references, but still had a null value as an implicit element of every type, you'd still have the problem of needing to do runtime checks for null everywhere.
sum = 0
for entry in entries:
case (val):
null: pass
number n: sum += n
endcase
in pseudocode. Several languages have offered this since forever (eg. Haskell and Maybe).The fun part is that the typesystem enforces that you check all possible cases -- or only lets you explicitly un wrap potentially null values.
So it's not like a C programmer checking if (x == NULL) manually.