domingo, 12 de abril de 2009

A famigerada java.lang.NullPointerException

Hoje eu respondi a um post sobre Arrays criado por um usuário de um dos fóruns Java que freqüento.

A dúvida era simples: como verificar se um elemento do array era nulo. O que me intrigou durante uns testes que eu fiz é que a exceção NullPointerException é lançada em muitos contextos diferentes. Decidi, então, pesquisar sobre mais detalhes dessa "famosa" exceção que, apesar de muito popular, gera dúvidas em programadores Java iniciantes - como eu - sobre em que casos ela é de fato lançada.

A NullPointerException é uma subclasse da RuntimeException e é lançada sempre que um valor null é fornecido em situações em que um objeto, ou uma referência a um objeto, precisa ser fornecido.

As situações específicas que causam o lançamento dessa exceção são:

  • A chamada de um método de instância de um objeto nulo. Por exemplo, quando um objeto é apenas inicializado e não instanciado. Assim, ele não pode ter um de seus métodos de instância chamado. Por distração, esse problema ocorre frequentemente quando se trabalha com arrays de objetos.

  • O acesso ou tentativa de modificação de um atributo de um objeto nulo.

Os outros três principais casos merecem exemplos em código:

  • A tentativa de se tomar o tamanho de um objeto nulo, ou seja, com referência a null, como se ele fosse um array.

String str = null;
int l;
l = str.length();
  • As tentativas de acesso ou modificação os elementos de um objeto nulo como se ele fosse um array. Talvez essa seja a causa mais comum. Segue o exemplo:

String str = null;
str[2] = "vai dar problema!";
  • O lançamento de um objeto nulo como se ele fosse uma subclasse de Throwable. Veja:

if(args.length == 0) thrownull;

Para não dizer que não falei de flores, o tipo null, segundo as especificações da JVM abstrata, isto é, sem distinção de implementações da JVM, está intimamente relacionado a referências. Ele é nada mais nada menos que uma referência nula, ou a nada.

A documentação da Java API aconselha que as aplicações deveriam lançar a exceção NullPointerException nos demais casos em que um valor null é fornecido em lugar de um objeto.

Em caso de dúvidas postem comentários.