No tutorial passado nos dedicamos a entender a classe Exception e suas muitas possibilidades. Sabemos que quando há algum problema com as linhas de código dentro do bloco try, um desvio para o bloco Catch é promovido.
Dessa forma o catch compreende um ponto de caída do código após a interrupção em seu fluxo de execução. É importante ressaltar que cada bloco try pode ser seguido por zero ou mais blocos catch.
Dentro do bloco principal onde havíamos comentado algumas linhas de código, retire o comentário da linha de código referente a idade do aluno. Observe que há uma conversão de uma String em um tipo inteiro.
aluno.setIdade(Integer.valueOf(idade));
E se o usuário no momento de informar a idade não informar um valor numérico, informando assim a idade em formato de texto?
Neste caso exemplificado acima o que será que aconteceria com a saída do nosso programa? Uma exceção de NumberFormatException é lançada.
Como o usuário informou um dado não numérico, no momento de fazer a conversão o Java não encontrou nada para converter. Esta exceção também é lançado para casos em que o campo é deixado vazio.
Note ainda que na janela gráfica um dos erros que o Java informa é no método forInputString, na linha -1. Fique tranquilo, estes erros não sobre a sua classe, mas sim, do próprio Java. Trata-se de uma pilha de erros referente a entrada de dados errada que simulamos, porém, são classes e métodos internos do Java.
Os erros apresentados dizem respeito por exemplo a tentativa de fazer a conversão (valueOf). Se clicar sobre o valueOf, você será redirecionado para dentro do Java, para uma área a qual não há nada que possa fazer. O que está ao nosso alcance fazer é corrigir o nosso código.
PREVENINDO O ERRO
Como não sabemos que tipo de erro pode ocorrer ou o que o usuário irá digitar, o que podemos fazer como medida de prevenção? Bom, como uma medida de prevenção este é um caso em que temos que capturar a exceção de forma bem específica.
O primeiro passo é passar como parâmetro o tipo de erro para o catch, o “Exception” dará lugar ao “NumberFormatException”. Dessa forma será possível saber quando a mensagem for capturada que trata-se de um erro de conversão. Ficando assim.
catch(NumberFormatException e){
//instruções
}
E no showMessageDialog, iremos informar na mensagem que se trata de um erro de conversão de número.
JOptionPane.showMessageDialog(null, "ERRO DE CONVERSÃO DE NÚMERO" +saida.toString());
Mas e se eu desejar capturar também um eventual NullPointerException? Procederemos abrindo um novo bloco catch, onde tentaremos pegar em qual classe o erro ocorreu.
Antes de executar, novamente inicialize a lista com um valor null para que a gente possa gerar um erro. E a mensagem exibida será como mostra a imagem abaixo.
Quando um erro é encontrado, automaticamente o bloco em execução é interrompido e um desvio é feito para a exceção, quando então esta é capturada.
EXCEÇÃO NÃO TRATADA
Este é um tipo de caso que exige um pouco mais de atenção visto que a apresentação do erro não se dá de forma aparente. Para simulá-la, logo no início do bloco try escreva a linha de código que criará um arquivo txt.
New File(“arquivo.txt”);
Ao executar o programa nenhum erro será mostrado, e isso ocorre porque só estamos capturando o NullPointerException e o NumberFormatException. O risco desse descuido poderá ser horas sobre o código sem conseguir identificar o problema.
Este tipo de erro pode ser tratado implementando uma exceção genérica do Exception. Em nosso próximo tutorial falaremos um pouco mais detalhadamente sobre arquivos e as exceção que poderá ser lançada sobre ele.
Catch (Exception e){
e.printStackTrace();
}
EM POUCAS PALAVRAS
Seguindo este mesmo raciocínio aplicado nos tratamentos das exceções que praticamos hoje, é possível capturar cada uma das exceções. Dessa forma não apenas poderemos ter um alto grau de especificidade, como poderemos proceder com um tratamento diferente para cada captura de exceção.
Obviamente em alguns casos teremos que encontrar uma forma de capturar exceções não tratadas, mas isso é assunto para um próximo tutorial. Espero que tenham gostado.