You are on page 1of 90

1

13
Tratamento de
exceo
2005 by Pearson Education do Brasil

OBJETIVOS
Neste captulo, voc aprender:
Como o tratamento de exceo e de erro funciona.
Como utilizar try, throw e catch para detectar,
indicar e tratar excees, respectivamente.
Como utilizar o bloco finally para liberar
recursos.
Como o desempilhamento permite que excees
no-capturadas em um escopo sejam capturadas
em outro escopo.
Como os rastreamentos de pilha ajudam na
depurao.
Como as excees so organizadas em uma
hierarquia de classes de exceo.
Como declarar novas classes de exceo.
Como criar excees encadeadas que mantm
informaes do rastreamento de pilha completo.
2005 by Pearson Education do Brasil

13.1

Introduo

13.2

Viso geral do tratamento de excees

13.3

Exemplo: Diviso por zero sem tratamento de excees

13.4

Exemplo: Tratando ArithmeticExceptions e


InputMismatchExceptions

13.5

Quando utilizar o tratamento de excees

13.6

Hierarquia de excees em Java

13.7

Bloco finally

13.8

Desempilhamento de pilha

13.9

printStackTrace, getStackTrace e getMessage

13.10 Excees encadeadas

13.11 Declarando novos tipos de exceo


13.12 Precondies e ps-condies
13.13 Assertivas
13.14 Concluso

2005 by Pearson Education do Brasil

13.1 Introduo
Exceo uma indicao de um problema que
ocorre durante a execuo de um programa.
Tratamento de excees resolver excees que
poderiam ocorrer para que o programa continue
ou termine elegantemente.

O tratamento de excees permite que os


programadores criem programas mais robustos e
tolerantes a falhas.

2005 by Pearson Education do Brasil

Dica de preveno de erro 13.1


O tratamento de exceo ajuda a aprimorar a
tolerncia a falhas de um programa.

2005 by Pearson Education do Brasil

13.1 Introduo
Exemplos:
ArrayIndexOutOfBoundsException
feita uma tentativa de acessar um elemento depois
do final de um array.
ClassCastException ocorre uma tentativa
de fazer uma coero em um objeto que no tem
um relacionamento um com o tipo especificado
no operador de coero.
NullPointerException quando uma
referncia null utilizada onde um objeto
esperado.

2005 by Pearson Education do Brasil

13.2 Viso geral do tratamento de


excees

Misturar a lgica do programa com a lgica do


tratamento de erros pode tornar os programas
difceis de ler, modificar, manter e depurar.
O tratamento de excees permite aos
programadores remover cdigo de tratamento de
erro da linha principal de execuo do
programa.
Aprimora a clareza.

Aprimora a modificabilidade.

2005 by Pearson Education do Brasil

Dica de desempenho 13.1


Se os problemas potenciais ocorrem raramente,
mesclar o programa e a lgica do tratamento de
erro pode degradar o desempenho de um
programa, porque o programa deve realizar
testes (potencialmente freqentes) para
determinar se a tarefa foi executada
corretamente e se a prxima tarefa pode ser
realizada.

2005 by Pearson Education do Brasil

13.3 Exemplo: Diviso por zero sem


tratamento de excees

Exceo lanada uma exceo que ocorreu.


Rastreamento de pilha:
Nome da exceo em uma mensagem descritiva que
indica o problema.
Pilha de chamadas de mtodo.
ArithmeticException pode surgir a partir de
diferentes problemas na aritmtica.
Ponto de lanamento ponto inicial em que a exceo
ocorre, linha superior da cadeia de chamadas.
Uma InputMismatchException ocorre quando o
mtodo Scanner nextInt recebe uma string que no
representa um inteiro vlido.
2005 by Pearson Education do Brasil

// Fig. 13.1: DivideByZeroNoExceptionHandling.java

// Um aplicativo que tenta dividir por zero.

10

3 import java.util.Scanner;
4
5 public class DivideByZeroNoExceptionHandling
6 {
7
// demonstra o lanamento de uma exceo quando ocorre uma diviso por zero
Tentativa de diviso;
8
public static int quotient( int numerator, int denominator )
denominator poderia ser zero
9
{
10
return numerator / denominator; // possvel diviso por zero
11
} // fim do mtodo quotient
12
13
public static void main( String args[] )
14
15

Resumo
DivideByZeroNoExce
ptionHandling.java

(1 de 2)

{
Scanner scanner = new Scanner( System.in ); // scanner para entrada

16
17
18

System.out.print( "Please enter an integer numerator: " );


int numerator = scanner.nextInt();

19
20
21
22
23

System.out.print( "Please enter an integer denominator: " );


entrada no for
int denominator = scanner.nextInt();

24

L a entrada; a exceo ocorre se a


um inteiro vlido

int result = quotient( numerator, denominator );


System.out.printf(
"\nResult: %d / %d = %d\n", numerator, denominator, result );

25
} // fim de main
26 } // fim da classe DivideByZeroNoExceptionHandling
Please enter an integer numerator: 100
Please enter an integer denominator: 7
Result: 100 / 7 = 14

2005 by Pearson Education do Brasil

11

Please enter an integer numerator: 100


Please enter an integer denominator: 7

Resumo

Result: 100 / 7 = 14

Please enter an integer numerator: 100


Please enter an integer denominator: 0
Exception in thread "main" java.lang.ArithmeticException: / by zero
at
DivideByZeroNoExceptionHandling.quotient(DivideByZeroNoExceptionHandling.java:10)
at
DivideByZeroNoExceptionHandling.main(DivideByZeroNoExceptionHandling.java:22)

DivideByZeroNoExce
ptionHandling.java

(2 de 2)

Please enter an integer numerator: 100


Please enter an integer denominator: hello
Exception in thread "main" java.util.InputMismatchException
at java.util.Scanner.throwFor(Unknown Source)
at java.util.Scanner.next(Unknown Source)
at java.util.Scanner.nextInt(Unknown Source)
at java.util.Scanner.nextInt(Unknown Source)
at
DivideByZeroNoExceptionHandling.main(DivideByZeroNoExceptionHandling.java:20)

2005 by Pearson Education do Brasil

12

13.4 Exemplo: Tratando ArithmeticExceptions


e InputMismatchExceptions
Com o tratamento de excees, o programa
captura e trata (isto , lida com) a exceo.
O exemplo a seguir permite que o usurio tente
novamente se uma entrada invlida for inserida
(zero para denominador ou entrada de nointeiro).

2005 by Pearson Education do Brasil

13

Incluindo cdigo em um bloco try


Bloco try contm o cdigo que pode lanar
(throw) uma exceo.
Consiste na palavra-chave try seguida por um
bloco de cdigo entre chaves.
Se ocorrer uma exceo em algum ponto, o
restante do cdigo contido no bloco try no ser
excecutado.

2005 by Pearson Education do Brasil

14

Observao de engenharia de
software 13.1
Excees podem emergir por meio de cdigo
explicitamente mencionado em um bloco try,
por chamadas para outros mtodos, por
chamadas de mtodo efetuadas a partir do
cdigo em um bloco try ou a partir da Java
Virtual Machine medida que ela executa os
bytecodes do Java.

2005 by Pearson Education do Brasil

15

Capturando excees
Um bloco catch:
Captura, isto , recebe e trata uma exceo.
Comea com a palavra-chave catch.
Parmetro de exceo entre parnteses o parmetro de exceo
identifica o tipo de exceo e permite que o bloco catch interaja
com o objeto da exceo capturada.
Bloco do cdigo entre chaves que executa quando uma exceo
do tipo adequado ocorre.

Bloco catch correspondente o tipo do parmetro de exceo


corresponde exatamente ao tipo de exceo lanado ou uma
superclasse dele.
Exceo no-capturada uma exceo que ocorre para a qual
no h nenhum bloco catch correspondente.
Faz com que o programa termine se o programa tiver somente
um thread; do contrrio apenas o thread atual terminado e
pode haver efeitos adversos no restante do programa.
2005 by Pearson Education do Brasil

16

Erro comum de programao 13.1


um erro de sintaxe colocar cdigo entre um
bloco try e seus blocos catch
correspondentes.

2005 by Pearson Education do Brasil

17

Erro comum de programao 13.2


Cada bloco catch pode ter apenas um nico
parmetro especificar uma lista de
parmetros de exceo separados por vrgulas
um erro de sintaxe.

2005 by Pearson Education do Brasil

18

Erro comum de programao 13.3

um erro de compilao capturar o mesmo


tipo em dois blocos catch diferentes em
uma nica instruo try.

2005 by Pearson Education do Brasil

Modelo de terminao de tratamento


de excees

19

Quando uma exceo ocorre:


O bloco try termina imediatamente.
O programa transfere o controle para o primeiro bloco catch
correspondente.

Depois de a exceo ser tratada:


Modelo de terminao do tratamento de excees o controle do
programa no retorna ao ponto de lanamento porque o bloco
catch terminou; o fluxo de controle prossegue para a primeira
instruo depois do ltimo bloco catch. Usado pelo Java.
Modelo de retomada do tratamento de excees o controle do
programa retomado logo depois do ponto de lanamento.
Usado por algumas outras linguagens,

2005 by Pearson Education do Brasil

20

Erro comum de programao 13.4


Erros de lgica podem ocorrer se voc
assumir que, depois de uma exceo ser
tratada, o controle retornar primeira
instruo depois do ponto de lanamento.

2005 by Pearson Education do Brasil

21

Dica de preveno de erro 13.2


Com o tratamento de excees, um programa
pode continuar executando (em vez de encerrar)
depois de lidar com um problema. Isso ajuda a
assegurar o tipo de aplicativos robustos que
colaboram para o que chamado de computao
de misso crtica ou computao de negcios
crticos.

2005 by Pearson Education do Brasil

22

Boa prtica de programao 13.1


Utilizar um nome de parmetro de exceo que
reflita o tipo do parmetro promove a clareza,
lembrando o programador do tipo de exceo
em tratamento.

2005 by Pearson Education do Brasil

23

Utilizando a clusula throws


Clusula throws especifica as excees que
um mtodo pode lanar.
Aparece depois da lista de parmetros do mtodo
e antes do corpo do mtodo.
Contm uma lista separada por vrgulas das
excees.
As excees podem ser lanadas pelas instrues
no corpo do mtodo ou pelos mtodos chamados
no corpo do mtodo.
As excees podem ser dos tipos listados na
clusula throws ou subclasses.

2005 by Pearson Education do Brasil

24

Dica de preveno de erro 13.3


Se souber que um mtodo pode lanar uma
exceo, inclua o cdigo de tratamento de
excees apropriado no programa para tornlo mais robusto.

2005 by Pearson Education do Brasil

25

Dica de preveno de erro 13.4


Leia a documentao on-line da API para obter
informaes sobre um mtodo antes de utilizar
esse mtodo em um programa. A documentao
especifica as excees lanadas pelo mtodo (se
houver alguma) e indica as razes pelas quais tais
excees podem ocorrer. Ento fornea o
tratamento para essas excees em seu
programa.

2005 by Pearson Education do Brasil

26

Dica de preveno de erro 13.5


Leia a documentao on-line da API de uma
classe de exceo antes de escrever o cdigo de
tratamento de excees para esse tipo de
exceo. Em geral, a documentao de uma
classe de exceo contm as razes potenciais de
sua ocorrncia durante a execuo de
programa.

2005 by Pearson Education do Brasil

1
2
3

// Fig. 13.2: DivideByZeroWithExceptionHandling.java


// Um exemplo de tratamento de excees que verifica a diviso por zero.
import java.util.InputMismatchException;

import java.util.Scanner;

5
6

public class DivideByZeroWithExceptionHandling

7
8
9

27

Resumo

{
// demonstra lanamento de uma execeo quando ocorre uma diviso por zero
public static int quotient( int numerator, int denominator )
throws ArithmeticException

10
11
12

13
14
15
16
17

} // fim do mtodo quotient

return numerator / denominator; //

A clusula throws especifica que o .java


quociente do mtodo talvez lance uma
possible ArithmeticException
division by zero
(1 de 3)

public static void main( String args[] )


{
Scanner scanner = new Scanner( System.in ); // scanner para entrada

18
19
20

boolean continueLoop = true; // determina se mais entradas so necessrias

21
22

23

DivideByZeroWithEx
ceptionHandling

A instruo de repetio faz um loop at o


bloco catch completar com sucesso

do

try // l dois nmeros e calcula o quociente

O bloco catch tenta ler a entrada


e realizar a diviso

24

System.out.print( "Please enter an integer numerator: " );

25

int numerator = scanner.nextInt();

26
27

Recupera entrada;
System.out.print( "Please enter an integer denominator: " );
int denominator = scanner.nextInt();
InputMismatchException

28

lanada se a entrada no tiver


inteiros vlidos

2005 by Pearson Education do Brasil

29
30
31
32
33
34
35
36
37
38
39
40

int result = quotient( numerator, denominator );


System.out.printf( "\nResult: %d / %d = %d\n", numerator,

{
System.err.printf( "\nException: %s\n",

DivideByZeroWithEx
ceptionHandling
Capturando uma InputMismatchException
(usurio

inseriu uma entrada de no-inteiro)


inputMismatchException );
.java
scanner.nextLine(); // descarta entrada para o usurio de novo
Parmetros de exceo
System.out.println(
"You must enter integers. Please try again.\n" L
);a entrada invlida, porm no faz nada com ela
} // fim de catch

42
43

catch ( ArithmeticException arithmeticException )


{

47
48
49
50

Resumo

Chama o mtodo quotient, que pode lanar


denominator, result );
uma ArithmeticException
continueLoop = false; // entrada bem-sucedida; fim de loop
} // fim de try
Se alcanarmos esse ponto, a entrada era vlida e o
catch ( InputMismatchException inputMismatchException ) denominador era no zero, portanto o loop pode parar

41

44
45
46

28

(2 de 3)
Notifica o usurio de que ocorreu um erro

System.err.printf( "\nException: %s\n", arithmeticException );


System.out.println(
"Zero is an invalid denominator. Please
try again.\n"
);
Capturando
uma ArithmeticException
(usurio inseriu
zero para o denominador)
} // fim de catch
} while ( continueLoop ); // fim de do...while
} // fim de main
} // fim da classe DivideByZeroWithExceptionHandling
Se a linha 32 nunca for alcanada com sucesso, o loop continua

e o usurio pode tentar novamente

2005 by Pearson Education do Brasil

Please enter an integer numerator: 100


Please enter an integer denominator: 7
Result: 100 / 7 = 14

29

Resumo

Please enter an integer numerator: 100


Please enter an integer denominator: 0

DivideByZeroWithEx
ceptionHandling

Exception: java.lang.ArithmeticException: / by zero


Zero is an invalid denominator. Please try again.

.java

Please enter an integer numerator: 100


Please enter an integer denominator: 7
Result: 100 / 7 = 14

(3 de 3)

Please enter an integer numerator: 100


Please enter an integer denominator: hello
Exception: java.util.InputMismatchException
You must enter integers. Please try again.
Please enter an integer numerator: 100
Please enter an integer denominator: 7
Result: 100 / 7 = 14

2005 by Pearson Education do Brasil

13.5 Quando utilizar o tratamento de


excees

30

O tratamento de excees foi concebido para


processar erros sncronos.
Erros sncronos ocorrem quando uma instruo
executa.
Erros assncronos ocorrem em paralelo e
independente do fluxo de controle do programa.

2005 by Pearson Education do Brasil

31

Observao de engenharia de
software 13.2
Incorpore sua estratgia de tratamento de
excees no sistema desde o princpio do processo
de projeto. Pode ser difcil incluir um tratamento
de excees eficiente depois que um sistema foi
implementado.

2005 by Pearson Education do Brasil

32

Observao de engenharia de
software 13.3
O tratamento de excees fornece uma tcnica
nica e uniforme para o processamento de
problemas. Isso ajuda os programadores de
grandes projetos a entender o cdigo de
processamento de erro uns dos outros.

2005 by Pearson Education do Brasil

33

Observao de engenharia de
software 13.4
Evite utilizar o tratamento de excees como uma
forma alternativa de fluxo de controle. Essas
excees adicionais podem interferir nas
verdadeiras excees do tipo erro.

2005 by Pearson Education do Brasil

34

Observao de engenharia de
software 13.5
O tratamento de excees simplifica a
combinao de componentes de software e
permite trabalhar em conjunto eficientemente,
possibilitando que os componentes predefinidos
comuniquem problemas para componentes
especficos do aplicativo, que, ento, podem
processar os problemas de maneira especfica ao
aplicativo.

2005 by Pearson Education do Brasil

35

13.6 Hierarquia de exceo em Java


Todas as excees so herdadas direta ou
indiretamente da classe Exception.
As classes Exception formam uma hierarquia
de herana que pode ser estendida.
Classe Throwable, superclasse da Exception:
Somente objetos Throwable podem ser utilizados
com o mecanismo de tratamento de excees.
Tem duas subclasses: Exception e Error.
A classe Exception e suas subclasses representam situaes
excepcionais que podem ocorrer em um programa Java e que
podem ser capturadas pelo aplicativo.
A classe Error e suas subclasses representam situaes
anormais que poderiam acontecer na JVM normalmente
no possvel que um programa se recupere de Errors.
2005 by Pearson Education do Brasil

36

Figura 13.3 | Parte da hierarquia de herana da classe Throwable.

2005 by Pearson Education do Brasil

37

13.6 Hierarquia de excees do Java


Duas categorias de excees: verificadas e no-verificadas.
Excees verificadas:
As excees que so herdadas da classe Exception, mas no de
RuntimeException.
O compilador impe um requisito do tipo capturar ou declarar.
O compilador verifica cada chamada de mtodo e declarao de
mtodo para determinar se o mtodo lana (throws) excees
verificadas. Se lanar, o compilador assegura que a exceo
verificada capturada ou declarada em uma clusula throws.
Se no capturada nem declarada, ocorre um erro de compilador.

Excees no-verificadas:
Herdam da classe RuntimeException ou da classe Error.
O compilador no verifica o cdigo para ver se a exceo foi
capturada ou declarada.
Se uma exceo no-verificada ocorrer e no tiver sido
capturada, o programa terminar ou executar com resultados
inesperados.
Em geral, podem ser evitadas com uma codificao adequada.
2005 by Pearson Education do Brasil

38

Observao de engenharia de
software 13.6
Os programadores so forados a lidar com as
excees verificadas. Isso resulta em cdigo mais
robusto do que aquele que seria criado se os
programadores fossem capazes de simplesmente
ignorar as excees.

2005 by Pearson Education do Brasil

39

Erro comum de programao 13.5


Um erro de compilao ocorre se um mtodo
tentar explicitamente lanar uma exceo
verificada (ou chamar outro mtodo que lana
uma exceo verificada) e essa exceo no
estiver listada na clusula throws do mtodo.

2005 by Pearson Education do Brasil

40

Erro comum de programao 13.6


Se um mtodo de subclasse anula um mtodo de
superclasse, um erro o mtodo de subclasse
listar mais excees em sua lista throws do que o
mtodo anulado da superclasse anulada. Mas a
clusula throws de uma subclasse pode conter um
subconjunto da lista throws de uma superclasse.

2005 by Pearson Education do Brasil

41

Observao de engenharia de
software 13.7
Se o mtodo chamar outros mtodos que lanam
explicitamente excees verificadas, essas
excees devem ser capturadas ou declaradas no
mtodo. Se uma exceo pode ser
significativamente tratada em um mtodo, o
mtodo deve capturar a exceo em vez de
declar-la.

2005 by Pearson Education do Brasil

42

Observao de engenharia de
software 13.8
Embora o compilador no imponha o requisito
capture ou declare para as excees noverificadas, ele fornece o cdigo de tratamento de
excees adequado quando se sabe que tais
excees so possveis. Por exemplo, um
programa deve processar a
NumberFormatException do mtodo Integer
parseInt, mesmo que NumberFormatException
(uma subclasse de RuntimeException) for um
tipo de exceo no-verificada. Isso torna os
programas mais robustos.
2005 by Pearson Education do Brasil

13.6 Hierarquia de excees do Java


(Continuao)

43

O bloco catch captura todas as excees do seu


tipo e das subclasses do seu tipo.
Se houver mltiplos blocos catch que
correspondam a um tipo particular de exceo,
somente a primeiro bloco catch correspondente
executa.
Faz sentido utilizar um bloco catch de uma
superclasse quando todos os blocos catch para
as subclasses dessa classe realizarem a mesma
funcionalidade.

2005 by Pearson Education do Brasil

44

Dica de preveno de erro 13.6


A captura de tipos de subclasse individualmente
est sujeita a erro se voc se esquecer de testar um
ou mais dos tipos de subclasse explicitamente;
capturar a superclasse garante que os objetos de
todas as subclasses sero capturados. Posicionar
um bloco catch para o tipo de superclasse depois
de todos os outros blocos catch de subclasses
dessa superclasse assegura que todas as excees
de subclasse sejam por fim capturadas.

2005 by Pearson Education do Brasil

45

Erro comum de programao 13.7


Colocar um bloco catch para um tipo de
exceo de superclasse antes de outros blocos
catch que capturam tipos de exceo de
subclasse impede que esses blocos executem,
ocorrendo, ento, um erro de compilao.

2005 by Pearson Education do Brasil

46

13.7 Bloco finally


Programas que obtm certos recursos devem retorn-los
ao sistema explicitamente para evitar vazamentos de
recursos.
Bloco finally:
Consiste na palavra-chave finally seguida por um bloco do
cdigo entre chaves.
Opcional em uma instruo try.
Se presente, colocado depois do ltimo bloco catch.
Executa se uma exceo for lanada no bloco try
correspondente ou qualquer um dos seus blocos catch
correspondentes.
No executar se a aplicao encerrar prematuramente em um
bloco try via o mtodo System.exit.
Em geral, contm cdigo de liberao de recursos.
2005 by Pearson Education do Brasil

47

Dica de preveno de erro 13.7


Uma questo sutil que o Java no elimina
inteiramente os vazamentos de memria. O
Java no efetuar coleta de lixo de um objeto
at no haver mais nenhuma referncia a ele.
Portanto, vazamentos de memria podem
ocorrer, se os programadores mantiverem
erroneamente referncias a objetos
indesejveis.

2005 by Pearson Education do Brasil

48

try

Resumo

instrues
instrues de aquisio de recurso
// fim de try
catch ( UmTipoDeExceo exceo1
}

instrues de tratamento de excees


}
.
.
.

// fim de catch

catch

OutroTipoDeExceo exceo2

instrues de tratamento de excees


// fim de catch
finally
}
{

instrues
instrues de liberao de recursos
}

// fim de finally

Figura 13.4 | A posio do bloco finally depois do ltimo bloco catch em uma instruo try.

2005 by Pearson Education do Brasil

49

13.7 Bloco finally (Continuao)


Se nenhuma exceo ocorrer, os blocos catch so
pulados e o controle prossegue para o bloco finally.
Depois de o bloco finally executar, o controle
prossegue para a primeira instruo depois do bloco
finally.
Se ocorrer uma exceo no bloco try, o programa pula o
restante do bloco try. A primeira correspondncia no
bloco catch executada e o controle prossegue para o
bloco finally. Se ocorrer uma exceo e no houver
nenhum bloco catch correspondente, o controle
prossegue para o bloco finally. Depois de o bloco
finally executar, o programa passa a exceo para o
prximo bloco try externo.
Se um bloco catch lanar uma exceo, o bloco
finally ainda executar.
2005 by Pearson Education do Brasil

50

Dica de desempenho 13.2


Sempre libere todos os recursos explicitamente e
logo que o recurso no for mais necessrio. Isso
torna os recursos imediatamente disponveis para
serem reutilizados pelo seu programa ou outros
programas, aprimorando assim o uso de recursos.
Como garantido que o bloco finally executar se
ocorrer uma exceo no bloco try correspondente,
esse bloco um lugar ideal para liberar recursos
adquiridos em um bloco try.

2005 by Pearson Education do Brasil

51

Dica de preveno de erro 13.8


Um bloco finally geralmente contm cdigo
para liberar recursos adquiridos em seu bloco
try correspondente; essa uma maneira
eficiente de eliminar vazamento de recursos.
Por exemplo, o bloco finally deve fechar
quaisquer arquivos abertos no bloco try.

2005 by Pearson Education do Brasil

52

13.7 Bloco finally (Continuao)


Fluxos-padro:
System.out o fluxo de sada padro.
System.err o fluxo de erros padro.

System.err pode ser utilizado para separar


sada com erro de uma sada normal.
System.err.println e
System.out.println exibem dados para o
prompt de comando por padro.

2005 by Pearson Education do Brasil

Lanando excees com a instruo


throw

53

Instruo throw utilizada para lanar


excees.
Os prprios programadores podem lanar
excees a partir de um mtodo se algo der
errado.
A instruo throw consiste na palavra-chave
throw seguida pelo objeto de exceo.

2005 by Pearson Education do Brasil

54

Observao de engenharia de
software 13.9
Quando toString for invocada em qualquer
objeto Throwable, sua string resultante inclui
a string descritiva que foi fornecida para o
construtor ou simplesmente o nome de classe se
nenhuma string foi fornecida.

2005 by Pearson Education do Brasil

55

Observao de engenharia de
software 13.10
Um objeto pode ser lanado sem conter
informao sobre o problema que ocorreu. Nesse
caso, o simples conhecimento de que uma exceo
de um tipo particular ocorreu pode fornecer
informaes suficientes para que a pessoa
responsvel processe o problema corretamente.

2005 by Pearson Education do Brasil

56

Observao de engenharia de
software 13.11
Excees podem ser lanadas a partir de
construtores. Quando um erro detectado em
um construtor, deve-se lanar uma exceo em
vez de se permitir a criao de um objeto
formado inadequadamente.

2005 by Pearson Education do Brasil

57

Relanando excees
As excees so relanadas quando um bloco
catch decide que ele no pode processar a
exceo ou apenas process-la parcialmente.
A exceo adiada para a instruo try externa.
A exceo relanada utilizando a palavra-chave
throw seguida por uma referncia ao objeto de
exceo.

2005 by Pearson Education do Brasil

58

Dica de preveno de erro 13.9


Evite colocar cdigo que possa lanar
(throw) uma exceo em um bloco finally.
Se esse cdigo for necessrio, inclua o cdigo
em um try...catch dentro do bloco
finally.

2005 by Pearson Education do Brasil

59

Erro comum de programao 13.8


Se uma exceo no tiver sido capturada
quando o controle entrar em um bloco
finally e o bloco finally lanar uma
exceo que no capturada no bloco
finally, a primeira exceo ser perdida e a
exceo do bloco finally ser retornada ao
mtodo chamador.

2005 by Pearson Education do Brasil

60

Erro comum de programao 13.9


Assumir que uma exceo lanada de um
bloco catch ser processada por esse bloco
catch ou por qualquer outro bloco catch
associado com a mesma instruo try pode
resultar em erros de lgica.

2005 by Pearson Education do Brasil

61

Boa prtica de programao 13.2


O mecanismo de tratamento de excees do Java
projetado para remover cdigo de processamento de erro
da linha principal do cdigo de um programa para
aprimorar a clareza de programa. No coloque
try...catch...finally em torno de cada instruo que
pode lanar uma exceo. Isso dificulta a leitura dos
programas. Em vez disso, coloque um bloco try em torno
de uma parte significativa do cdigo, de modo que esse
bloco try seja seguido por blocos catch que tratem cada
possvel exceo e os blocos catch sejam seguidos por um
nico bloco finally (se algum for necessrio).

2005 by Pearson Education do Brasil

// Fig. 13.5: UsingExceptions.java

// Demonstrao do tratamento de excees try...catch...finally

// mechanism.

62

Resumo

4
5
6
7
8
9

public class UsingExceptions


{
public static void main( String args[] )
{
try

UsingExceptions
.java

10

11
12
13

throwException(); // chama mtodo throwException


} // fim de try
catch ( Exception exception ) // exceo
por
throwException
Chama lanada
o mtodo
que
lana uma

14

15
16

System.err.println( "Exception handled in main" );


} // fim de catch

17
18
19
20

(1 de 3)

exceo

doesNotThrowException();
} // fim de main

2005 by Pearson Education do Brasil

21

// demonstra try...catch...finally

22

public static void throwException() throws Exception

23

63

24

try // lana uma exceo e imediatamente a captura

25

26

System.out.println( "Method throwException" );

27

throw new Exception(); // gera exceo

Resumo
UsingExceptions
.java

28

} // fim de try

29

catch ( Exception exception ) // captura


lanada
em try
Cria exceo
uma nova
Exception

30

e a lana

System.err.println(

31

(2 de 3)

"Exception handled in method throwException" );

32

throw exception; // lana novamente para processamento adicional

33
34

// qualquer cdigo aqui no seriaLana


alcanado
uma

35
36

Exception previamente
criada

37

} // fim de catch

38

finally // executa independentemente do que ocorre em try...catch

39

40
41
42
43
44

System.err.println( "Finally
in executa
throwException"
);
O bloco executed
finally
mesmo que
} // fim de finally

uma exceo seja relanada no bloco


catch

// qualquer cdigo aqui no seria atingido, exceo lanada de novo em catch

2005 by Pearson Education do Brasil

45

} // fim do mtodo throwException

46
47
48

// demonstra finally quando no ocorre nenhuma exceo


public static void doesNotThrowException()

49
50
51
52
53
54
55

{
try // bloco try no lana uma exceo
{
System.out.println( "Method doesNotThrowException" );
} // fim de try
catch ( Exception exception ) // no executa
{

64

Resumo
UsingExceptions
.java

System.err.println( exception );

56
57

} // fim de catch

58

finally // executa independentemente do que ocorre em try...catch

59
60
61
62

(3 de 3)

System.err.println(
O bloco finally executa mesmo que
"Finally executed in doesNotThrowException" );
nenhuma exceo seja lanada
} // fim de finally

63
64
System.out.println( "End of method doesNotThrowException" );
65
} // fim do mtodo doesNotThrowException
66 } // fim da classe UsingExceptions
Method throwException
Exception handled in method throwException
Finally executed in throwException
Exception handled in main
Method doesNotThrowException
Finally executed in doesNotThrowException
End of method doesNotThrowException

2005 by Pearson Education do Brasil

65

13.8 Desempilhamento de pilha


Desempilhamento de pilha Quando uma
exceo lanada, mas no capturada em um
escopo em particular, a pilha de chamadas de
mtodo desempilhada, e feita uma tentativa
de capturar (catch) a exceo no prximo bloco
try externo.
Quando o desempilhamento ocorre:
O mtodo em que a exceo no foi capturada termina.
Todas as variveis locais nesse mtodo saem do escopo.
O controle retorna instruo que originalmente invocou
o mtodo se um bloco try incluir a chamada de mtodo,
feita uma tentativa de capturar a exceo.
2005 by Pearson Education do Brasil

// Fig. 13.6: UsingExceptions.java

// Demonstrao do desempilhamento.

66

Resumo

3
4

public class UsingExceptions

public static void main( String args[] )

UsingExceptions
.java

try // chama throwException


para o
demonstrar
o desempilhamento
Chama
mtodo que
lana uma

exceo
throwException();

10
11

} // fim de try

12

catch ( Exception exception ) // exceo lanada em throwException

13

14
15
16
17

(1 de 2)

exceo
System.err.println( "ExceptionCaptura
handleda in
main" que
);

} // fim de catch
} // fim de main

poderia ocorrer no
bloco try anterior, incluindo a
chamada ao mtodo
throwException

2005 by Pearson Education do Brasil

18

// throwException lana exceo que no capturada nesse mtodo

19

public static void throwException() throws Exception

20

21

try // lana uma exceo e a captura em main

22

23

System.out.println( "Method throwException" );

24

throw new Exception(); // gera a exceo

67

Resumo
O mtodo lana uma exceo
UsingExceptions
.java

25

} // fim de try

26

catch ( RuntimeException runtimeException


) // nova
captura
tipo incorreto
Lana
exceo;
exceo

27

{
System.err.println(

28

"Exception handled in method throwException" );

29
30

no
capturada no bloco try atual, portanto
tratada no bloco try externo

} // fim de catch

31

O finally
bloco finally
executa
finally // o bloco
sempre executa

32

33
34
35

(2 de 2)

antes de
retornar o controle ao bloco try
System.err.println( "Finally is
always executed" );
externo

} // fim de finally
} // fim do mtodo throwException

36 } // fim da classe UsingExceptions


Method throwException
Finally is always executed
Exception handled in main

2005 by Pearson Education do Brasil

13.9 printStackTrace,
getStackTrace e getMessage

68

Os mtodos na classe Throwable recuperam


informaes adicionais sobre uma exceo.
printStackTrace envia a sada do rastreamento de
pilha para o fluxo de erros padro.
getStackTrace recupera informaes do
rastreamento de pilha como um array de objetos.
StackTraceElement; permite processamento
personalizado das informaes sobre a exceo.
getMessage retorna a string descritiva armazenada em
uma exceo.

2005 by Pearson Education do Brasil

69

Dica de preveno de erro 13.10


Uma exceo que no capturada em um
aplicativo faz com que o handler de exceo
padro do Java execute. Isso exibe o nome da
exceo, uma mensagem descritiva que indica
o problema que ocorreu e um completo
rastreamento da pilha de execuo.

2005 by Pearson Education do Brasil

70

Dica de preveno de erro 13.11


O mtodo Throwable toString (herdado
por todas as subclasses Throwable) retorna
uma string contendo o nome da classe da
exceo e uma mensagem descritiva.

2005 by Pearson Education do Brasil

13.9 printStackTrace,
getStackTrace e getMessage
(Continuao)

71

Mtodos StackTraceElement:
getClassName
getFileName
getLineNumber
getMethodName

As informaes sobre o rastreamento de pilha


seguem o padro
nomeDaClasse.nomeDoMtodo(nomeDoArquivo:
nmeroDaLinha).

2005 by Pearson Education do Brasil

// Fig. 13.7: UsingExceptions.java

// Demonstrando GetMessage e printStackTrace a partir da classe Exception.

72

3
4

public class UsingExceptions

Resumo

12

UsingExceptions
Chamada ao mtodo1, mtodo1 chama o
mtodo2, o mtodo2 chama o
.java
try
mtodo3
e
o
mtodo3
lana
uma
nova
{
Exception
method1(); // chama method1
Exibe a string descritiva da
} // fim de try
exceo lanada no (1
mtodo3
de 3)
catch ( Exception exception ) // captura exceo lanada em method1

13

public static void main( String args[] )

8
9
10
11

14

System.err.printf( "%s\n\n", exception.getMessage() );

15

exception.printStackTrace(); // imprime rastreamento de pilha da exceo

16

Recupera as informaes na pilha


como um array dos objetos
StackTraceElement

17

// obtm informaes de rastreamento de pilha

18
19

StackTraceElement[] traceElements = exception.getStackTrace();

Exibe o rastreamento de pilha da


exceo lanada no mtodo3

2005 by Pearson Education do Brasil

20

System.out.println( "\nStack trace from getStackTrace:" );

21

System.out.println( "Class\t\tFile\t\t\tLine\tMethod" );

22

73

Recupera o nome de classe do


StackTraceElement atual

Resumo

23

// faz um loop por traceElements para obter a descrio da exceo

24

for ( StackTraceElement element : traceElements )

25

26

System.out.printf( "%s\t", element.getClassName() );

27

System.out.printf( "%s\t", element.getFileName() );

28

System.out.printf( "%s\t", element.getLineNumber() );

29

System.out.printf( "%s\n", element.getMethodName() );


} // fim de for

30

} // fim de catch

31
32

} // fim de main

33
34

// chama method2; lana excees de volta para

35

public static void method1() throws Exception

36

37
38
39

Recupera o nome de arquivo do


StackTraceElement
atual
UsingExceptions
Recupera o nmero da linha do
.java
StackTraceElement
atual

Recupera o nome de mtodo do


StackTraceElement atual
(2 de 3)
mtodo1 chama mtodo2, mtodo2
chama mtodo3 e este lana uma
Exception
main

method2();
} // fim do mtodo method1

2005 by Pearson Education do Brasil

40

// chama method3; lana excees de volta para method1

41

public static void method2() throws Exception

42

44

} // fim do mtodo method2

UsingExceptions

45
46

// lana Exception de volta para method2

47

public static void method3() throws Exception

48

49
50

Resumo

mtodo2 chama mtodo3, que lana uma


Exception

method3();

43

74

Exceo criada e lanada


.java

throw new Exception( "Exception thrown in method3" );


} // fim do mtodo method3

(3 de 3)

51 } // fim da classe UsingExceptions


Exception thrown in method3
java.lang.Exception: Exception thrown in method3
at UsingExceptions.method3(UsingExceptions.java:49)
at UsingExceptions.method2(UsingExceptions.java:43)
at UsingExceptions.method1(UsingExceptions.java:37)
at UsingExceptions.main(UsingExceptions.java:10)
Stack trace from getStackTrace:
Class
File
UsingExceptions UsingExceptions.java
UsingExceptions UsingExceptions.java
UsingExceptions UsingExceptions.java
UsingExceptions UsingExceptions.java

Line
49
43
37
10

Method
method3
method2
method1
main

2005 by Pearson Education do Brasil

75

Observao de engenharia de
software 13.12
Nunca ignore uma exceo que voc
captura. Pelo menos utilize
printStackTrace para gerar a sada de
uma mensagem de erro. Isso informar os
usurios de que existe um problema; assim
eles podero adotar as aes adequadas.

2005 by Pearson Education do Brasil

76

13.10 Excees encadeadas


Excees encadeadas permitem a um objeto de
exceo manter informaes completas sobre o
rastreamento de pilha quando uma exceo
lanada a partir de um bloco catch.
Os usurios podem recuperar as informaes
sobre uma exceo original.
O rastreamento de pilha proveniente de uma
exceo encadeada exibe quantas excees
encadeadas restam.

2005 by Pearson Education do Brasil

// Fig. 13.8: UsingChainedExceptions.java

// Demonstrando excees encadeadas.

77

Resumo

3
4

public class UsingChainedExceptions

public static void main( String args[] )

try

{
method1(); // chama method1

10

UsingChainedExcept
ions.java

Captura a exceo no method1


(1 debem
3)
como quaisquer excees encadeadas
associadas

11

} // fim de try

12

catch ( Exception exception ) // excees lanadas de method1

13

14
15
16
17

exception.printStackTrace();
} // fim de catch
} // fim de main

2005 by Pearson Education do Brasil

18

// chama method2; lana excees de volta para main

19

public static void method1() throws ExceptionW

20

21

try

22

{
method2(); // chama method2

23

78

Resumo
Captura a exceo no method2, lana uma nova
exceo a ser encadeada com
excees anteriores
UsingChainedExcept
ions.java

24

} // fim de try

25

catch ( Exception exception ) // exceo lanada de method2

26

{
throw new Exception( "Exception thrown in method1", exception );

27

} // fim de try

28
29

(2 de 3)

} // fim do mtodo method1

30
31

// chama method3; lana excees de volta para method1

32

public static void method2() throws Exception

33

34

try

35

{
method3(); // chama method3

36

Captura a exceo no method3, lana uma nova


exceo a ser encadeada com excees anteriores

37

} // fim de try

38

catch ( Exception exception ) // exceo lanada de method3

39

40
41
42
43

throw new Exception( "Exception thrown in method2", exception );


} // fim de catch
} // fim do mtodo method2

2005 by Pearson Education do Brasil

44

// lana Exception novamente para method2

45

public static void method3() throws Exception

46

47
48

79

Resumo

throw new Exception( "Exception thrown in method3" );


} // fim do mtodo method3

49 } // fim da classe UsingChainedExceptions

UsingChainedExcept
Exceo original lanada
ions.java

java.lang.Exception: Exception thrown in method1


at UsingChainedExceptions.method1(UsingChainedExceptions.java:27)
at UsingChainedExceptions.main(UsingChainedExceptions.java:10)
Caused by: java.lang.Exception: Exception thrown in method2
at UsingChainedExceptions.method2(UsingChainedExceptions.java:40)
at UsingChainedExceptions.method1(UsingChainedExceptions.java:23)
... 1 more
Caused by: java.lang.Exception: Exception thrown in method3
at UsingChainedExceptions.method3(UsingChainedExceptions.java:47)
at UsingChainedExceptions.method2(UsingChainedExceptions.java:36)
... 2 more

(3 de 3)

2005 by Pearson Education do Brasil

13.11 Declarando novos tipos de


exceo

80

Voc pode declarar suas prprias classes de exceo


especficas dos problemas que podem ocorrer quando um
outro programa utiliza suas classes reutilizveis.
A nova classe de exceo deve estender uma classe de
exceo existente.
Em geral, ela contm somente dois construtores:

Um no recebe nenhum argumento, passa


mensagens de exceo padro para o construtor
da superclasse.
O outro recebe uma mensagem personalizada
de exceo como uma string e a passa para o
construtor da superclasse.
2005 by Pearson Education do Brasil

81

Observao de engenharia de
software 13.13
Se possvel, indique as excees provenientes
de seus mtodos utilizando classes de
exceo existentes, em vez de criar novas
classes de exceo. A API do Java contm
muitas classes de exceo que podem ser
adequadas ao tipo de problema que seu
mtodo precisa indicar.

2005 by Pearson Education do Brasil

82

Boa prtica de programao 13.3


Associar cada tipo de mau
funcionamento srio em tempo de
execuo com uma classe Exception
apropriadamente identificada
aprimora a clareza do programa.

2005 by Pearson Education do Brasil

83

Observao de engenharia de
software 13.14
Ao definir seu prprio tipo de exceo, estude as classes
de exceo existentes na API do Java e tente estender
uma classe de exceo relacionada. Por exemplo, se
estiver criando uma nova classe para representar
quando um mtodo tenta uma diviso por zero, voc
poderia estender a classe ArithmeticException
porque a diviso por zero ocorre durante a aritmtica.
Se as classes existentes no forem superclasses
apropriadas para sua nova classe de exceo, decida se
a nova classe deve ser uma classe de exceo verificada
ou no-verificada. (Continua)
2005 by Pearson Education do Brasil

84

Observao de engenharia de
software 13.14 (Continuao)
A nova classe de exceo deve ser uma exceo
verificada (isto , estender Exception, mas no
RuntimeException) se possveis clientes
precisarem tratar a exceo. A aplicao cliente
deve ser razoavelmente capaz de se recuperar de
tal exceo. A nova classe de exceo deve
estender RuntimeException se o cdigo de cliente
for capaz de ignorar a exceo (isto , se a exceo
for uma exceo no-verificada).

2005 by Pearson Education do Brasil

85

Boa prtica de programao 13.4


Por conveno, todos os nomes de classe
de excees devem terminar com a
palavra Exception.

2005 by Pearson Education do Brasil

86

13.12 Precondies e ps-condies


As precondies e ps-condies so os estados
antes e depois da execuo de um mtodo.
So utilizadas para facilitar a depurao e
melhorar o projeto.
Voc deve declarar as precondies e as pscondies em um comentrio antes da declarao
de mtodo.

2005 by Pearson Education do Brasil

13.12 Precondies e ps-condies


(Continuao)

87

Precondies
A condio que deve ser verdadeira quando o mtodo
invocado.

Descrevem parmetros de mtodo e quaisquer outras


expectativas que o mtodo tenha sobre o estado atual de
um programa.
Se as precondies no forem satisfeitas, o comportamento
do mtodo ser indefinido.

Ps-condies
A condio que verdadeira depois de o mtodo retornar
com sucesso.
Descrevem o valor de retorno e quaisquer outros efeitos
colaterais que o mtodo possa apresentar.
Ao chamar um mtodo, voc pode assumir que um mtodo
satisfaz todas as suas ps-condies.
2005 by Pearson Education do Brasil

88

13.13 Assertivas
Assertivas so condies que devem ser
verdadeiras em um ponto particular em um
mtodo.
Ajudam a assegurar a validade de um programa
capturando potenciais bugs.
As precondies e as ps-condies so dois tipos
de assertivas.
As assertivas podem ser declaradas como
comentrios ou podem ser validadas
programaticamente utilizando a instruo
assert.
2005 by Pearson Education do Brasil

89

13.13 Assertivas (Continuao)


Instruo assert:
Avalia uma expresso boolean e determina se ela true
ou false
Duas formas:
Expresso assert; AssertionError lanada se
expresso for false.
Assert expresso1: expresso2; AssertionError
lanada se expresso1 for false, expresso2 a mensagem
de erro.

Utilizada para verificar estados intermedirios a fim de


assegurar que o cdigo funciona corretamente.
Utilizado para implementar as precondies e pscondies programaticamente.

Por padro, assertivas esto desativadas.


As assertivas podem ser ativadas com a opo de linha de
comando ea.
2005 by Pearson Education do Brasil

1
2

// Fig. 13.9: AssertTest.java


// Demonstra a instruo assert

3
4

import java.util.Scanner;

public class AssertTest

6 {
7
8
9
10
11
12
13
14
15

90

Resumo
AssertTest.java

public static void main( String args[] )


{
Scanner input = new Scanner( System.in );
System.out.print( "Enter a number between 0 and 10: " );
int number = input.nextInt();

Instruo assert

A mensagem a ser exibida com o


AssertionError

// afirma que o valor absoluto > = 0


assert ( number >= 0 && number <= 10 ) : "bad number: " + number;

16
17
System.out.printf( "You entered %d\n", number );
Se o nmero for menor que 0 ou maior
18
} // fim de main
que 10, um AssertionError
19 } // fim da classe AssertTest

ocorrer
Enter a number between 0 and 10: 5
You entered 5

Enter a number between 0 and 10: 50


Exception in thread "main" java.lang.AssertionError: bad number: 50
at AssertTest.main(AssertTest.java:15)

2005 by Pearson Education do Brasil

You might also like