Olá desenvolvedores, hoje vamos nos dedicar a entender a classe Exception. Sabemos que exceções são erros que podem ocorrer durante a execução de um programa. Aprendemos também que a classe Exception é também uma subclasse RuntimeException, isto é, exceções verificadas (unchecked exception).
Sendo um tipo de exceção que é verificada no momento da execução, o compilador não acusa erro em tempo de compilação. Outra importante informação é que as exceções verificadas como as da classe Exception precisam ser declaradas no escopo de um método construtor. E é isso o que vamos aprender hoje.
O Exception se enquadra em um contexto de erros genéricos, onde não se sabe o que vai acontecer. Isto é, quando todos os tratamentos manuais objetivando prevenir possíveis imprevistos já foram implementados. Neste caso, envolve-se todo o bloco de código em um try/catch.
ANALISANDO A CLASSE EXCEPTION
Começamos a nossa análise nos perguntando por que em um bloco catch não é necessário utilizar o System.out.print para imprimir. Entre os recursos que o Java oferece temos o método printStackTrace para trabalhar com pilhas de exceções.
Dessa forma o método printStackTrace traz sua própria rotina de impressão no console. Assim sendo nós o utilizamos para os casos em que uma exceção é lançada. dessa forma teremos como imprimir no console a sequência dos erros, isto é, a pilha de erros, uma vez que StackTrace retorna um array.
e.printStackTrace();
Mas o fato do bloco catch não precisar utilizar o método System.out.print, não significa que não podemos utilizá-lo. Aliás, seu uso é bem recomendado para imprimir mensagens ainda mais amigáveis de erros ou causa dos mesmos.
System.out.println("ERRO: " +e.getMessage());
Ressaltando que este “e” que precede os comandos refere-se ao Exception. Seguindo com a análise, a linha de código acima retornará o erro, neste caso um “null”.
O método getMessage(), herdado da classe java.lang cumpre o objetivo de retornar uma mensagem mais detalhada do erro. Como simulamos um erro deixando uma variável nula, foi gerado um NullPointerException. Dessa forma o getMessage() pegou este erro e nos apresentou no console.
Mas se você busca por um meio de buscar todas as informações do erro, como linha, método, classe, o recurso é o StackTrace(). Que como já informamos, retorna um array. Dessa forma, para não corrermos o risco de perder algum dado, este array deverá está contido dentro de uma estrutura de repetição. Usaremos o for.
IMPRIMINDO NO CONSOLE COM O STACKTRACE()
O cabeçalho do for é composto por uma variável de controle seguida do seu valor de inicialização; seguida pela condição de continuação do loop. Ou seja, repetirá enquanto for menor ou igual a pilha de erros que o StackTrace exibe. E por fim, o incremento.
Dentro do for, imprimiremos o erro, por meio de um System.out.print, e como se trata de array, poderemos passar a posição de análise do erro do StackTrace. Mas o principal objetivo é podermos personalizar a mensagem, deixando-a ainda mais clara para o nosso entendimento. Observe que o StackTrace nos oferece uma lista de possiblidades.
Neste exemplo imprimiremos três dos cinco atributos, ClassName(), LineNumber(), MethodName(), personalizaremos casa um deles.
A saída da nossa implementação será como mostra a imagem abaixo:
Observe que o erro é um null (NullPointerException), ocorre no método main, na linha 77, na classe executável, PrimeiraClasseJava.
IMPRESSÃO DE ERRO PERSONALIZADA
Para que possamos personalizar a impressão do erro no console, iremos utilizar o StringBuilder, uma classe Java que faz parte do pacote java.lang. O StringBuilder nos permitirá criar e manipular dados de Strings de forma dinâmica. O que significa que poderemos criar variáveis de String modificáveis.
StringBuilder saida = new StringBuilder();
Com o StringBuilder poderemos concatenar strings invocando o método append. O append aloca novas strings concatenadas para o mesmo objeto, ao invés de criar objetos novos. Assim, volte ao código e substitua o System.out.print por “saida.append”.
E na impressão do showMessageDialog, concatenaremos um saida.toString(). Assim, teremos a pilha exibida em uma janela gráfica.
EM POUCAS PALAVRAS
Hoje aprendemos a trabalhar dentro do bloco catch, de modo a entender melhor as possibilidades de uma classe Exception. Vimos que podemos personalizar o que será exibido na tela, o que poderá proporcionar um melhor e mais rápido entendimento acercado que está acontecendo no código. Ou seja, a causa que motivou a exceção.
Aprendendo a manipular a classe do Exception ficará muito mais fácil para você lidar com os erros inesperados que ocorrem em um sistema.
E para corrigir o erro de NullPointerEsception do nosso sistema, basta instanciar a lista, substituindo o null por new ArrayList<Aluno>();.