Você está na página 1de 9

Java First-Tier: Aplicaes

Grupo de Linguagens de Programao - DI/PUC-Rio

Programao Java Tratamento de Excees


Grupo de Linguagens de Programao Departamento de Informtica PUC-Rio

Motivaes para Excees


? Um

mtodo pode detectar uma falha mas no estar apto a resolver sua causa, devendo repassar essa funo a quem saiba ? Se introduzirmos o tratamento de falhas ao longo do fluxo normal de cdigo, podemos estar comprometendo muito a inteligibilidade
2

Java First-Tier: Aplicaes

Grupo de Linguagens de Programao - DI/PUC-Rio

Excees
? Diz-se

que uma exceo lanada para sinalizar alguma falha ? O lanamento de uma exceo causa uma interrupo abrupta do trecho de cdigo que a gerou ? O controle da execuo volta para o primeiro trecho de cdigo (na pilha de chamadas) apto a tratar a exceo lanada
3

Suporte a Excees
? As

linguagens OO tipicamente do suporte ao uso de excees ? Para usarmos excees precisamos de:
uma representao para a exceo uma forma de lanar a exceo uma forma de tratar a exceo

Java First-Tier: Aplicaes

Grupo de Linguagens de Programao - DI/PUC-Rio

Excees em Java
? Java

d suporte ao uso de excees:

so representadas por classes so lanadas pelo comando throw so tratadas pela estrutura try-catch-finally
? De

modo geral, um mtodo que lance uma exceo deve declarar isso explicitamente ? Para uma classe representar uma exceo, ela deve pertencer a uma certa hierarquia
5

Exemplo de Uso
? Considere

a classe:

public class Calc { public int div(int a, int b) { return a/b; } }

?O

mtodo div , se for chamado com b igual zero, dar um erro. Esse erro poderia ser sinalizado atravs de uma exceo
6

Java First-Tier: Aplicaes

Grupo de Linguagens de Programao - DI/PUC-Rio

Modelando uma Exceo


? Vamos,

ento, modelar uma exceo que indica uma tentativa de diviso por zero:

public class DivByZero extends Exception { public String toString() { return "Division by zero."; } }

Lanando uma Exceo


? Agora

vamos fazer com que o mtodo div lance a exceo que criamos:

public class Calc { public int div(int a, int b) throws DivByZero { if (b == 0) throw new DivByZero(); return a/b; } }

Java First-Tier: Aplicaes

Grupo de Linguagens de Programao - DI/PUC-Rio

Tratando uma Exceo


? Podemos,

agora, utilizar o mtodo div e tratar a exceo, caso esta ocorra:

... Calc calc = new Calc(); try { int div = calc.div(x, y); System.out.println(div); } catch (DivByZero e) { System.out.println(e); } ...
9

Tipos de Excees em Java


? Java

possui dois tipos de excees:

Checked Exceptions so excees que devem ser usadas para modelar falhas contornveis. Devem sempre ser declaradas pelos mtodos que as lanam e precisam ser tratadas (a menos que explicitamente passadas adiante) Unchecked Exceptions so excees que devem ser usadas para modelar falhas incontornveis. No precisam ser declaradas e nem tratadas
10

Java First-Tier: Aplicaes

Grupo de Linguagens de Programao - DI/PUC-Rio

Hierarquia de Excees
Throwable

Error

Exception

Runtime Exception

IOException

...

11

Checked Exceptions
? Para

criarmos uma classe que modela uma checked exception, devemos estender a classe Exception ? Essa exceo ser sempre verificada pelo compilador para garantir que seja tratada quando recebida e declarada pelos mtodos que a lanam
12

Java First-Tier: Aplicaes

Grupo de Linguagens de Programao - DI/PUC-Rio

Unchecked Exceptions
? Para

criarmos uma classe que modela uma unchecked exception, devemos estender a classe Error ou RuntimeException ? Esse tipo de exceo no ser verificado pelo compilador ? Tipicamente no criamos excees desse tipo, elas so usadas pela prpria linguagem para sinalizar condies de erro
13

Repassando Excees
? Se

quisssemos usar o mtodo div sem tratar a exceo, deveramos declarar que a exceo deve ser passada adiante:

public void f() throws DivByZero { Calc calc = new Calc(); int div = calc.div(a,b); System.out.println(div); }

14

Java First-Tier: Aplicaes

Grupo de Linguagens de Programao - DI/PUC-Rio

Tratando e Repassando Excees


? Mesmo

tratada, a exceo pode ser repassada:

public void f() throws DivByZero { Calc calc = new Calc(); try { int div = calc.div(x, y); System.out.println(div); } catch (DivByZero e) { System.out.println(e); throw e; } }
15

Estrutura try-catch-finally
Como apresentado, usamos try-catch para tratar uma exceo. A terceira parte dessa estrutura, finally , especifica um trecho de cdigo que ser sempre executado, no importando o que acontecer dentro do bloco try-catch No possvel deixar um bloco try-catchfinally sem executar sua parte finally
16

Java First-Tier: Aplicaes

Grupo de Linguagens de Programao - DI/PUC-Rio

Exemplo de try-catch-finally
void readFile(String name) throws IOException { FileReader file = null; try { file = new FileReader(name); ... // l o arquivo } catch (Exception e) { System.out.println(e); } finally { if (file != null) file.close(); } }
17

Tratando Mltiplas Excees


try { ... } catch (Exception1 e1) { ... } catch (Exception2 e2) { ... } finally { ... }

18

Você também pode gostar