I use assertions to make sure that I don't introduce errors in my code. If I know that a value should be in a map, I assert for that (using the assert keyword). If I know that a parameter should never be null, I assert for that. If I know that the parameter can be null, then I will check it and throw the appropriate exception.
I read it at Code Complete or Effective Java - assertions should be used to detect programming errors - exceptions should be used to handle exceptional but possible situations. You don't need to check for null on every method on your code if you know that the value will not be null (as defined by a contract), but it doesn't hurt to assert if a value is not null. Assertions are only enabled if you specify the parameter -ea to the VM and they should not impact the performance of your application if disabled.
You should use more logging too :-). Learn when to use trace, debug and info and make sure that you log everything that your application does. It makes life so easier when you have to figure out why something is not working in a production environment.