NullPointerException

Segundo a especificação Java esta exceção ocorre quando:

    • Ocorre uma chamada para um método de um objeto nulo;
    • Há uma tentativa de acessar ou modificar um campo de um objeto nulo;
    • Se tenta recuperar o tamanho (length) de um objeto nulo como se ele fosse uma array;
    • Na tentativa de acessar ou modificar elementos de um objeto nulo como se este fosse um array;
  • Um objeto nulo é lançado como se fosse um valor Throwable.

Em resumo, esta exceção indica que houve a tentativa de acessar um objeto ou recursos contidos nele, mas ele estava nulo.

Geralmente há uma mensagem neste padrão:

java.lang.RuntimeException: java.lang.NullPointerException

Para uma melhor compreensão do erro, será gerado um pequeno programa Java feito para causar esta exceção:

1) Crie um arquivo chamado NullPointer.java, com este código:

public class NullPointer{

public static void main(String []args) {

Teste teste = new Teste( "10" );

System.out.println ("Tamanho1: " + teste.getValor().length() );

Teste teste2 = new Teste(null);

System.out.println ("Tamanho2: " + teste2.getValor().length() );

}

}

2) Crie um arquivo chamado Teste.java, com este código:

public class Teste {

private String texto = null;

public Teste ( String nova) {

this.texto = nova;

}

public String getValor( ) {

return this.texto;

}

}

3) Compile os programas em Java: NullPointer.java e Teste.java:

javac NullPointer.java Teste.java

4) Execute o programa:

java NullPointer

5) O programa causou o seguinte erro:

Tamanho1: 2

Exception in thread "Main Thread" java.lang.NullPointerException

at NullPointer.main(NullPointer.java:8)

*Observe que a primeira mensagem aparece sem problemas, mas a segundo envia um valor nulo, causando a exceção;

O erro ocorreu porque tentamos verificar o tamanho de um objeto que era nulo, ou seja, ao invés de existir uma classe do tipo String, havia apenas uma referência nula.

Para evitar que o problema de NullPointerException ocorra temos sempre que verificar se o retorno existe, antes que seja utilizado em algum processamento.

6) Neste caso utilizamos diretamente o comando teste2.getValor().length(), quando o ideal é:

public class NullPointer{

public static void main(String []args) {

Teste teste = new Teste( "10" );

System.out.println ("Tamanho1: " + teste.getValor().length() );

Teste teste2 = new Teste(null);

if(teste2.getValor() != null ) {

System.out.println ("Tamanho2: " + teste2.getValor().length() );

}

else

System.out.println ("Tamanho2: null");

}

}

7) Repita os passo 3) e 4), feito isto teremos o seguinte resultado:

Tamanho1: 2

Tamanho2: null

Cada caso terá um tratamento, muitas vezes os objetos vêm do banco de dados, de alguma integração ou faz parte de alguma outra rotina. Na maioria das vezes, os desenvolvedores acreditam que as classes sempre virão preenchidas, e acabam não efetuando a validação.

Em alguns casos o prazo para desenvolvimento é muito curto e o programa fica pobre de validação. Ou, em alguns casos, por preguiça de colocar as validações.

Não importa qual o caso, o desenvolvedor tem a responsabilidade de sempre validar os objetos que recebe.

Mostramos apenas um exemplo de NullPointerException, mas existem uma infinidades de códigos que geram esta exceção, e todas elas poderiam ser evitadas apenas validando se o objeto é ou não nulo.