Universidade Federal do Amazonas Departamento de Ciência da Computação IEC481 – Projeto de Programas Tratamento de Exceções em Java Professor: César Melo Slides baseados em materiais preparados pela Profa. Rosiane Freitas e Prof. Horácio. Tratamento de Exceções Exceção é uma condição anormal ocorrida durante a execução ou compilação de um programa; JAVA permite o tratamento de exceções; Semelhante ao de C++, sendo feito através de 5 palavras-chave: try, catch, throw, throws e finally; Toda exceção deve ser derivada da classe THROWABLE; Exceções cortar(cebola); panela.adicionar(cebola); cortar(tomate); panela.adicionar(tomate); panela.adicionar(Oleo.medida(colher)); comer(); Exceções tente { cortar(cebola); panela.adicionar(cebola); cortar(tomate); panela.adicionar(tomate); panela.adicionar(Oleo.medida(colher)); } imprevisto(CortarDedo e) { dedo.aplicar(curativo); } comer(); Exceções Condições que forçam a parada de um programa ou a realização de ações especiais. Por exemplo: divisão por zero. Fornecem uma forma de notificar erros (ou condições especiais) e de corrigí-los durante a execução de um programa. Exemplo class Exemplo { public static void main(String[] a) { int[] vet = new int[3]; for(int c=0; c<4; c++) vet[c] = 0; System.out.println(“Fim do programa.”); } } Exemplo class Exemplo { public static void main(String[] a) { int[] vet = new int[3]; try { for(int c=0; c<4; c++) vet[c] = 0; } catch(Exception e) { System.out.println(“Houve um erro!”); } System.out.println(“Fim do programa.”); } } Exceções Benefícios de ter erros sinalizados por exceções: separação entre o código que trata os erros e o código que é executado normalmente pelo programa. uma forma de forçar uma resposta ao erro. deve existir um código no programa para tratar o erro. não será possível compilar o programa caso tal tratamento não seja fornecido. Tipos de Exceções Existem quatro categorias mais usuais: 1. Erros de código ou tipo de dados coerção inválida, índice fora do limite do vetor, divisão por zero. 2. Erros indicados pelos métodos já existentes ao usar o método substring() da classe String, ela pode gerar uma exceção do tipo StringIndexOutOfBoundsException Tipos de Exceções Existem quatro categorias mais usuais: 3. Definição de novos tipos de exceções veremos mais adiante como criar novos tipos de exceções de acordo com as necessidades do programa. 4. Erros de Java erros causados pela Máquina Virtual Java que está executando o programa do usuário. em geral são causados por erros do próprio programa ou do ambiente em que a JVM é executada e não da própria JVM. try ... catch( ) ... finally ... try bloco catch(instância de uma subclasse de Exception) bloco finally bloco A palavra try marca o início do tratamento de exceções. try deve ser seguido de um ou mais catch e/ou exatamente um finally. O bloco finally é executado sempre, ocorrendo ou não uma exceção. try ... catch( ) ... finally ... try { // Código que pode gerar uma exceção } catch(MinhaExcecao1 e) { // Código para processar a exceção } catch(MinhaExcecao2 e) { // Código para processar a exceção } finally { // Código que sempre será executado } Execução Normal A execução começa no início do bloco try { // Código que pode gerar uma exceção } O bloco finally é executado após a execução normal do bloco try. try Havendo um return, return o bloco finally sempre será executado antes da saída do método. catch(MinhaExcecao1 e) { // Código para processar a exceção } Se não houver return no bloco try nem no bloco finally, finally a execução continua com o código após o bloco finally catch(MinhaExcecao2 e) { // Código para processar a exceção } finally { // Código que sempre será executado } Execução com Exceção A execução começa no início do bloco A execução é interrompida no ponto onde foi gerado a exceção. O controle passa para o bloco catch que capturá-la. O bloco finally será executado logo após o bloco catch. catch A execução continua com o código após o bloco finally caso não exista return. return try { // Código que pode gerar uma exceção } catch(MinhaExcecao1 e) { // Código para processar a exceção } catch(MinhaExcecao2 e) { // Código para processar a exceção } finally { // Código que sempre será executado } Exemplo class Exemplo { public static void main(String[] a) { int[] vet = new int[3]; try { for(int c=0; c<4; c++) vet[c] = 0; } catch(ArrayIndexOutOfBoundsException e) { System.out.println(“Erro no vetor!”); } catch(Exception e) { System.out.println(“Houve um erro!”); } System.out.println(“Fim do programa.”); } } Exemplo class Exemplo { public static void main(String[] a) { int[] vet = new int[3]; try { for(int c=0; c<4; c++) vet[c] = 0; } finally {System.out.println(“Entrada garantida”);} System.out.println(“Fim do programa.”); } } Gerando uma Exceção Métodos podem gerar exceções para indicar condições de erro public void meuMetodo() throws IOException { ... } public void meuMetodo() throws IOException, OutraExcecao { ... } Gerando uma Exceção Os métodos que os utilizam devem tratar as possíveis exceções public void outroMetodo() { try { meuMetodo(); } catch(IOException e) { // O tratamento é feito aqui } } Exemplo public double divisao(double n, double d) throws Exception { if (d == 0.0) { throw new Exception(”denominador não ”+ “pode ser zero"); return 0.0; // nunca é executado! } else return (n / d); } Exemplo public void teste() {double r =0.0; try { r = divisao(3,0); } catch(Exception e) { System.out.println(e.getMessage()); } System.out.println(“A divisão é ”+r); } A exceção tem de ser tratada ou então passada adiante! Exemplo public void teste() throws Exception { double r = 0.0; r = divisao(3,0); System.out.println(“A divisão é ”+r); } Uma exceção pode ser passada adiante até gerar um erro de execução. Reenviando Exceções try { // comandos; } catch(Exception e) { // faz alguma coisa antes de sair; throw e; } finally { // Também é executado } // Nunca passará por aqui se houver erro Criando Novas Exceções Uma exceção é um objeto Exceções São Objetos Exceções que podem ser capturadas Exceções que podem não ser capturadas Error Exceptions Representam condições de erros as quais não se espera que o programa possa recuperá-las. não se espera que o programa venha a tratá-las. Exemplos: falta de memória. bytecode não encontrado dinamicamente. Criando Uma Nova Exceção public class NovaExcecao extends Exception { public NovaExcecao() { super(“Houve um novo erro!”); } public NovaExcecao(String msg) { super(msg); } } Porque Usar Exceções? Tratar exceções ajuda a escrever o processamento de erros em um único lugar. Os erros descritos por um método não podem ser ignorados. Exceções são objetos: podem combinar dados e métodos ROBUSTEZ Tratamento de Exceções em Java Dúvidas? Divisão por Zero Uma divisão inteira por zero gera uma exceção. Uma divisão real por zero não gera uma exceção. Aritmética de ponto-flutuante segue o padrão IEEE 754. Valores de retorno: POSITIVE_INFINITY, NEGATIVE_INFINITY, ... Exceções Internas É possível escrever instruções aritméticas sem se preocupar explicitamente com a checagem de erros. int div(int a, int b) { return (a / b); } Exceções Internas int div(int a, int b) { return (a / b); } void teste() { int a=1, b=0, c=3; System.out.prinln(a+“/”+b+“=”+div(a,b)); System.out.prinln(b+“/”+c+“=”+div(b,c)); } Exceções Internas int div(int a, int b) { return (a / b); } void teste() { int a=1, b=0, c=3; try { System.out.prinln(a+“/”+b+“=”+div(a,b)); System.out.prinln(b+“/”+c+“=”+div(b,c)); }catch(Exception e) { System.out.println(e); } }