Olá Pessoal, tudo bom?
O post de hoje continuará trabalhando com o código da conversão de datas que estamos tratando há algumas semanas. Iremos ver como tratar os NullPointerExceptions que estavam ocorrendo nos testes do JUnit. Assim iremos fazer um devaneio sobre o tratamento dessas exceptions, pois é um problema que eu vejo ocorrer em muitos códigos construídos mesmo por desenvolvedores mais experientes. Confira o post a seguir…
Tratando NullPointers
O primeiro aspecto aqui é verificarmos em quais testes ocorreram os erros. De acordo com o JUnit as exceptions ocorreram quando foram executados os testes testeDataNula() e testeFormatoNulo(), o que era de se esperar visto que não fazemos um tratamento para valores inválidos ou nulos.
Vamos pensar rapidamente, para tratar valores nulos o que fazemos? Criamos ifs para isso. 😛
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 |
package br.com.mauda.exemplos.dates.versao7.exemplo001.v2; import java.text.ParseException; import java.text.SimpleDateFormat; import java.util.Date; public class ConvertDate { public enum DateFormat { USA_FORMAT("MM/dd/yyyy"), BR_FORMAT("dd/MM/yyyy"); private String format; private DateFormat(String format) { this.format = format; } public String getFormat() { return format; } } public static Date parseDate(String date, DateFormat formato) { if(date == null){ return null; } if(formato == null){ return null; } SimpleDateFormat sdf = new SimpleDateFormat(formato.getFormat()); try { return sdf.parse(date); } catch (ParseException e) { return null; } } } |
Mas agora vamos pensar, faz sentido nós retornarmos um valor nulo? Apenas estaríamos propagando o valor perante outras classes do código. Vamos pensar em uma forma melhor. De acordo com a lógica de tratamento de erros do Java nós podemos lançar exceptions quando for conveniente dentro do código. Assim ao invés de retornarmos um valor nulo, vamos lançar uma exception.
Olhando o código já existente, podemos perceber que já existe um catch tratando ParseException(), podemos aproveitar isso. Assim ao invés de retornarmos null, iremos lançar uma ParseException para cada if de validação e ainda suprimir o try catch já que não é necessário. Por fim para que tudo funcione o método deve lançar uma ParseException, indicando que não segurará a exception. Confira tudo isso no código abaixo:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 |
package br.com.mauda.exemplos.dates.versao7.exemplo001.v2; import java.text.ParseException; import java.text.SimpleDateFormat; import java.util.Date; public class ConvertDate { public enum DateFormat { USA_FORMAT("MM/dd/yyyy"), BR_FORMAT("dd/MM/yyyy"); private String format; private DateFormat(String format) { this.format = format; } public String getFormat() { return format; } } public static Date parseDate(String date, DateFormat formato) throws ParseException { if(date == null){ throw new ParseException("Deverá ser informada uma data a ser formatada", 0); } if(formato == null){ throw new ParseException("Deverá ser informado um formato de data para a formatação", 0); } SimpleDateFormat sdf = new SimpleDateFormat(formato.getFormat()); return sdf.parse(date); } } |
Mas quem irá tratar as exceptions? Se você olhar após essa modificação todos os seus testes irão ficar com erro, pois em nenhum deles nós tratamos ParseException(). Agora nós iremos trabalhar no código da classe Teste. Primeiramente vamos fazer com que todos os testes propaguem a ParseException,a fim de evitar erros de compilação, além disso, para os métodos testeDataNula() e testeFormatoNulo() nós iremos inserir uma informação na annotation @Test a fim de mostrar qual é a exception que nós estamos esperando que aconteça.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 |
package br.com.mauda.exemplos.dates.versao7.exemplo001.v2; import java.text.ParseException; import org.junit.Test; public class Teste { @Test public void testeOK() throws ParseException{ ConvertDate.parseDate("08/05/2016", ConvertDate.DateFormat.BR_FORMAT); } @Test(expected=ParseException.class) public void testeDataNula() throws ParseException{ ConvertDate.parseDate(null, ConvertDate.DateFormat.BR_FORMAT); } @Test(expected=ParseException.class) public void testeFormatoNulo() throws ParseException{ ConvertDate.parseDate("08/05/2016", null); } @Test public void testeDataFormatoDiferentes() throws ParseException{ ConvertDate.parseDate("08/05/2016", ConvertDate.DateFormat.USA_FORMAT); } } |
Agora todos os testes deverão executar corretamente, ficando todos verdes.
Lembrando que todos os códigos acima, para facilitar estão disponíveis no projeto Exemplos no Repositório Git do Bitbucket. Se você não sabe como clonar um repositório, veja meus tutoriais Versionamento Git na IDE Eclipse.
Com isso nós encerramos a parte da conversão String-Date, mas ainda existe o caminho inverso, Date-String, o qual iremos apresentar num próximo artigo.
finnaly{
Duvidas ou sugestões? Deixe seu feedback! Isso ajuda a saber a sua opinião sobre os artigos e melhorá-los para o futuro! Isso é muito importante!
Até um próximo post!
Leave a Reply