Tratamento de NullPointerException

Pessoal,

 Senho os seguintes métodos em minha entidade:

 [code]
  public Calendar getDataDaCriacao() {
    return dataDaCriacao;
}

public String getDataDaCriacaoStringBr(FormatadorDataCalendar formatador) {
    String dataConvertida = "";
    if (this.dataDaCriacao != null) {
        formatador.setData(dataDaCriacao);
        dataConvertida = formatador.getDataStringBr();
    }
    return dataConvertida;
}
 [/code]

E o código do FormatadorDataCalendar:

public class FormatadorDataCalendar {
    
    private Calendar data;

    /**
     * Construtor que recebe uma data como parâmetro
     * @param data 
     */
    public void setData(Calendar data) {
        this.data = data;
    }
    
    /**
     * Converte e retorna uma data Calendar no formato String/br. Caso a data passada seja nula, retorna uma string vazia
     * @return String
     */
    public String getDataStringBr(){
       
        String dataString = "";
        if(this.data != null){
            int dia = this.data.get(Calendar.DAY_OF_MONTH);
            int mes = this.data.get(Calendar.MONTH);
            int ano = this.data.get(Calendar.YEAR);
            
            String diaString = dia < 10 ? "0"+dia : String.valueOf(dia);
            String mesString = mes < 10 ? "0"+mes : String.valueOf(mes);
            dataString = diaString + "/" + mesString + "/" + ano;
        }
        return dataString;
    }
    
    
    
}

Gostaria da opinião de vocês no seguinte. Não sei se o correto seria o formatador retornar uma String vazia mesmo caso esteja tratando uma data nula ou se o correto seria o formatador forçar o tratamento de uma Exception na minha entidade. De que forma vocês fariam? Qual seria a forma correta?

Acho que esta correto a forma que você fez não encontrei problema, a unica coisa que talvez colocaria era no data != null && data != " "
Retornando null mesmo como voce fez acho que fica mais facil pra se trabalhar.

Olhando alguns artigos, alguns citam que a forma correta seria deixar o tratamento da Exception pra quem a chamou, e ela decidir o que fazer com ela. Dessa forma:

/**
 *
 * @author anderson
 */
public class FormatadorDataCalendar {

    private Calendar data;

    /**
     * Construtor que recebe uma data como parâmetro
     * @param data 
     */
    public void setData(Calendar data) {
        this.data = data;
    }

    /**
     * Converte e retorna uma data Calendar no formato String/br. Caso a data passada seja nula, retorna uma string vazia
     * @return String
     */
    public String getDataStringBr(){

        String dataString = "";
        
        int dia = this.data.get(Calendar.DAY_OF_MONTH);
        int mes = this.data.get(Calendar.MONTH);
        int ano = this.data.get(Calendar.YEAR);

        String diaString = dia < 10 ? "0" + dia : String.valueOf(dia);
        String mesString = mes < 10 ? "0" + (mes+1) : String.valueOf(mes);
        dataString = diaString + "/" + mesString + "/" + ano;

        return dataString;
    }
}
public String getDataDaCriacaoStringBr(FormatadorDataCalendar formatador) {
        String dataConvertida = null;
        try {
            formatador.setData(dataDaCriacao);
            dataConvertida = formatador.getDataStringBr();
        }catch(NullPointerException ex){
            throw ex;
        }
        return dataConvertida;
    }

Seguinto essa filosofia. Criei o seguinte teste no JUnnit:

@Test(expected=NullPointerException.class)
    public void testGetDataDaCriacaoStringBrComDataNula() {
        System.out.println("getDataDaCriacaoStringBr");
        OrdemDeServico instance = new OrdemDeServico();
        when(formatadorDeData.getDataStringBr()).thenThrow(NullPointerException.class);
        String result = instance.getDataDaCriacaoStringBr(formatadorDeData);
        fail("Deveria ter Lançado uma exception.");
        
    }

O que acham?

Isso concordo, é assim que eu também faço. Acho que é a melhor forma mesmo.

O grande problema que vejo nisso, é que por NullPointerException ser unchecked, não tem como garantir que os métodos que chamam esse método getDataDaCriacaoStringBr tratem essa Exception.

Anderson, crie sua propria exceção verificada então. Algo como DateException ou outro nome que queira chamar.

flw.

Gostaria da opinião de vocês no seguinte. Não sei se o correto seria o formatador retornar uma String vazia mesmo caso esteja tratando uma data nula ou se o correto seria o formatador forçar o tratamento de uma Exception na minha entidade. De que forma vocês fariam? Qual seria a forma correta?

o formatador nao deve retornar String vazia pq o client do seu codigo espera uma string com a data formatada.

Neste caso vc poderia retornar null e seu cod. client trata isso (acho feio)

Ou lançar exception, porem apesa re-lançar como:

try {
 ....
catch(TipoEx ex) {
 throw ex;
 }
}

nao faz sentido algum…

Entao seguindo o conselho do LP vc pode relançar a sua propria ex checada, ou até mesmo nao checada.

abrasssss

por que razão o seu atributo seria nulo?

de repente vc poderia pensar em uma maquina de estados e se este atributo não foi setado ele esta em um estado invalido não sendo possivel fazer certas operacoes OU forçar que nunca esteja nesse estado (como setando um valor default para este atributo e nunca deixando ser setado null)