Tratamento de Erros Sérgio Luiz Ruivace Cerqueira sergioruivace@gmail.com
Agenda Introdução Try, catch, finally Unchecked Exceptions Como levantar exceções Boas práticas
O problema Calculadora numero1: int numero2: int resultado: int equacao: String lerdados() dividir() multiplicar() imprimir()
A implementação, o que pode dar errado? public class Calculadora { private int numero1; private int numero2; private int resultado; private String equacao; public void lerdados(){ Scanner scanner = new Scanner(System.in); System.out.println("Digite o dividendo:"); numero1 = Integer.parseInt(scanner.next()); System.out.println("Digite o divisor:"); numero2 = Integer.parseInt(scanner.next()); public void dividir(){ resultado = numero1 / numero2; equacao = numero1 + "/" +numero2 +" = "+resultado; public void multiplicar(){ resultado = numero1 * numero2; equacao = numero1 + "*" +numero2 +" = "+resultado; public void imprimir(){ System.out.println(equacao);
O cliente public static void main (String[] args) { Calculadora calculadora = new Calculadora(); calculadora.lerdados(); calculadora.dividir(); calculadora.imprimir();
Possibilidades de erros Se o divisor for 0 Se usuário digitar algo que não seja um número
Informações Trace de execução Tipo da exceção Mensagem Local
Como tratar esses erros de forma elegante? Exceções Seguem os mesmos princípios de OO Encapsulamento Abstração Uma exceção é Um evento Que ocorreu durante a execução do programa Que interrompeu o fluxo normal de execução Quando esse evento ocorre Cria-se um objeto do tipo Exception Esse objeto encapsula as informações da exceção Fornece métodos para manipular essas informações
Como tratar esses erros de forma elegante? Sendo assim, existem duas responsabilidades Alguém tem que criar o objeto Alguém pode tratar aquela exceção Exemplo: Se o usuário digitou algo que não tenha sido um número, pode-se pedir para ele digitar outro valor Se houve um erro ao ler um arquivo, pode ser por causa de algum lock, pode-se tentar em alguns instantes Chama-se o tratamento de exceções de Exception Handling E o tratador da exceção de Exception Handler
Importante É importante diferenciar o descobrimento do erro com o local onde o tratamento ocorre Em muitos casos, não é possível fazer nada muito útil no local onde o erro ocorre
Exemplo: identificando a origem dos erros public class Calculadora { private int numero1; private int numero2; private int resultado; private String equacao; public void lerdados(){ Scanner scanner = new Scanner(System.in); System.out.println("Digite o dividendo:"); numero1 = Integer.parseInt(scanner.next()); System.out.println("Digite o divisor:"); numero2 = Integer.parseInt(scanner.next()); public void dividir(){ resultado = numero1 / numero2; equacao = numero1 + "/" +numero2 +" = "+resultado; public void multiplicar(){ resultado = numero1 * numero2; equacao = numero1 + "*" +numero2 +" = "+resultado; public void imprimir(){ System.out.println(equacao);
Exemplo: onde tratar os erros? Possibilidade 01: Localmente
Exemplo: onde tratar os erros? Possibilidade 01: Localmente
Exemplo: onde tratar os erros? Possibilidade 01: Externamente
Exemplo: onde tratar os erros? Possibilidade 01: Externamente
Sintaxe para a captura de exceções em Java Se você quiser tratar a exceção utilize o comando try catch Sintaxe: try { // Lista de comandos em que a exceção pode ocorrer catch (<Tipo da exceção capturada> <identificador>){ // Código para o tratamento da exceção catch (<Tipo da exceção capturada> <identificador 2>){ // Código para o tratamento da exceção
Como funciona?
Tipos de Exceções
Tipos de Exceções Checked X Unchecked Vamos ao nosso código Nada nos obrigou a tratar as exceções que poderiam ocorrer Unchecked Exceptions
Tipos de Exceções Unchecked
Tipos de Exceções Mas em alguns casos, temos que obrigatoriamente lidar com as exceções PrintWriter outputstream = new PrintWriter( new FileWriter(nomeDoArquivo));
Criando suas próprias exceções Simples, basta herdar Para checked exceptions: public class MinhaExcecao extends Exception {... Para unchecked public class MinhaExcecao extends RuntimeException {...
Levantando Exceções Para retornar um valor normal usamos o return Para retornar uma exceção usamos o throw Exemplo: public void meumetodo throws MinhaExcecao {... throw new MinhaExcecao();
finally Bloco que é sempre executado Ocorrendo ou não a exceção Exemplo: try { objeto.metodoquelevantaexcecap(); catch (ExcecaoLevantada e) {... finally { comandos;
finally Muito utilizado para liberar recursos CleanUp Exemplo, fechando a stream de gravação de um arquivo: finally { if (out!= null) { System.out.println("Closing stream"); out.close; else { System.out.println("Stream not open");
Boas práticas Quando usar uncheked exceptions? Regra básica Se o seu cliente puder fazer alguma coisa para se recuperar do erro, não faça unchecked Caso contrário faça a sua exceção unchecked Não crie exceções se elas não adicionam nada Ao levantar múltiplas exceções, verifique se elas não significam a mesma coisa para o cliente
Fim