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:
Object encontrar(int id) {
Object resultado = null;
// tenta achar resultado
return resultado; // pode retornar null
}
É melhor fazer isso:
Object encontrar(int id) throws ObjetoNaoEncontradoException {
Object resultado = null;
// tenta encontrar
if (resultado == null)
throw new ObjetoNaoEncontradoException(...);
return resultado;
}
Evite ao máximo trabalhar com referências nulas. Isso aqui é um belo dum code smell: if ( foo != null ).