Essa exceção acontece quando o código tenta acessar um membro de uma referência nula.
Object x = null;
x.toString(); // NullPointerException
Não sei o que você quer dizer com “como ela é detectada”, se é como a JVM sabe a hora de lançar essa exceção ou como podemos captura-la.
No primeiro caso, acontece um segmentation fault pois o programa tenta acessar uma área de memória nula. A JVM captura esse erro e lança a NPE na thread que estava executando na hora do segfault.
No segundo caso, só colocar um try {} catch (NullPointerException e) {}. Contudo, isso me leva a próxima pergunta. Sim, NPEs são erros de programação.
Evitar trabalhar com valores null é uma boa prática de programação. Ao invés de fazer isso: