Tratamento de Exceções em Java · Tratamento de Exceções Exceção é uma condição anormal...

Post on 20-Jul-2020

3 views 0 download

Transcript of Tratamento de Exceções em Java · Tratamento de Exceções Exceção é uma condição anormal...

Universidade Federal do AmazonasDepartamento de Ciência da ComputaçãoIEC481 – Projeto de Programas

Tratamento de Exceçõesem 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 blococatch(instância de uma subclasse de Exception) blocofinally 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

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 }

A execução começano início do bloco

O bloco finallyfinally é executado após a execução normal do bloco trytry.

Havendo um returnreturn, o bloco finallyfinally sempre será executado antes da

saída do método.

Se não houver returnreturn no bloco trytry nem no bloco finallyfinally, a execução continua com

o código após o bloco finallyfinally

Execução com Exceção

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 }

A execução começano início do bloco

A execução é interrompida no pontoonde foi gerado a exceção.

O controle passa para o bloco catchcatch que capturá-la.

O bloco finallyfinally será executado logoapós o bloco catchcatch.

A execução continua com o código após o bloco finallyfinally caso

não exista returnreturn.

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); }}

ROBUSTEZROBUSTEZ

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

ROBUSTEZROBUSTEZ

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); }}