Translate

domingo, 4 de novembro de 2012

Java - Evitar NullPointerException

O NullPointerException é um erro comum num programa escrito em Java quando se opera uma variável do tipo objeto sem antes verificar se está nula.

Algumas estratégias sugerem usar um padrão de produção do objeto que ao invéz de retornar um valor nulo é retornado um objeto que simboliza não ter encontrado o objeto esperado. Exemplo: new ContatoNaoEncontrado("Not found").

Essa sugestão é ruim porque requer a criação de uma classe adicional para simbolizar o caso de não encontrado e ainda torna frustrante a codificação porque o fluxo esperado do programador pode ser enganado caso ele se descuide e deixe de verificar se o objeto retornado representa "not found" (não encontrado).

Acredito que não exista uma fórmula mágica para evitar todas as verificações de nulidade, mas nem por isso devemos deixar de acreditar numa solução que simplifica bastante esta tarefa em casos corriqueiros onde se trabalha com valores mais simples como é o caso das operações de números ou textos em termos de atributo ou variável simples para apoiar a execução de um método.

A função sugerida aqui é para simplificar operações de atributos e até mesmo realizar ETL de forma ágil e limpa, pois isso não é errado e reduz o volume de códigos na situação explicada. Aplicar um padrão de projeto nesses casos não convém e seria impraticável algum padrão de projeto.


Como a maior parte dos programas trata valores numericos e alfanuméricos em grande volume, elaborei esta técnica na tentativa de contribuir com a boa prática de programação. Ela consiste na criação de um método chamado ANPE (Avoid NullPoiterException ou Evitar NullPointerException) que recebe dois valores. Se o primeiro valor for nulo, então retorna o segundo valor.

Vamos à prática.

AvoidNullPointerException

A classe AvoidNullPointerException conterá o método ANPE do qual falei. Ele é estático e utiliza Java Generic para tornar a função flexível ao tratar todos os objetos. Coloque a classe dentro de uma package br.com.wt.util para facilitar o exercício.

package br.com.wt.util;
public class AvoidNullPointerException {
   
    public static <V> V ANPE(V object, V object2) {

        if (object == null) {
            return object2;
        }
       
        return object;

    }
       
}


Testando

O teste é simples, pois se value for nulo, então o tornaremos 0L (zero). A importação da função estática ANPE diminui o trabalho para invocá-la:

import static br.com.wt.util.AvoidNullPointerException.ANPE;

public class Test {
   
    public static void main(String[] args) {

        Long value = null;

        if (ANPE(value, 0L) == 1L) {
            value = 100L;
        }

    }
       
}


Este teste pode ser realizado com String, Integer, Short, Double, Float e outros tipos de objetos desde que se esteja testando um valor.

Mais um teste para fixar

Agora com uma String.

import static br.com.wt.util.AvoidNullPointerException.ANPE;

public class Test {
   
    public static void main(String[] args) {

        String country = null;

        if (ANPE(country, "").equals("Brazil")) {
            System.out.println("World Cup 2014");
        } else {
            System.out.println("But will 2016 Olympics in Brazil");
        }
       
    }
       
}


Boa programação.

Nenhum comentário:

Postar um comentário