It certainly is.
Most of the time, your variables shouldn't be null to begin with. Many new languages are coming out with builtin support for non-nullable reference types -- that is, types which are guaranteed to never be null.
For the times when your incoming value is allowed to be null, you need to do a check. But exceptions are definitively a bad way to do this.
An if statement takes perhaps three instructions to perform and is a local check (meaning, you make the check in the same place as you need the guarantee).
Using an exception, on the other hand, may take many more instructions -- the system attempts to look up the method, fails, looks through the exception table for the appropriate exception handler, jumps there, executes the handler, and jumps again. Furthermore, the check is potentially non-local. If your code is something like this:
try
return contacts.find("Mom").getEmail()
catch (NullPointerException e)
return null
You don't know whether the NPE was thrown in 'getEmail' or in 'find'.
A technical worse solution to a very, very common pattern written in a more obfuscated way? It isn't rank, but it definitely smells bad :/