Você está na página 1de 90

1

13
Tratamento de
exceo

2005 by Pearson Education do Brasil


2

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
3

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


4

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


5

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


6

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


7

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


8

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


9

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


1 // Fig. 13.1: DivideByZeroNoExceptionHandling.java 10
2 // Um aplicativo que tenta dividir por zero.
3 import java.util.Scanner; Resumo
4
5 public class DivideByZeroNoExceptionHandling
6 {
7 // demonstra o lanamento de uma exceo quando ocorre uma diviso por zero
DivideByZeroNoExce
Tentativa de diviso; ptionHandling.java
8 public static int quotient( int numerator, int denominator )
9 { denominator poderia ser zero
10 return numerator / denominator; // possvel diviso por zero (1 de 2)
11 } // fim do mtodo quotient
12
13 public static void main( String args[] )
14 {
15 Scanner scanner = new Scanner( System.in ); // scanner para entrada
16
17 System.out.print( "Please enter an integer numerator: " );
18 int numerator = scanner.nextInt();
L a entrada; a exceo ocorre se a
19 System.out.print( "Please enter an integer denominator: " );
20 int denominator = scanner.nextInt();
entrada no for um inteiro vlido
21
22 int result = quotient( numerator, denominator );
23 System.out.printf(
24 "\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

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

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 no-
inteiro).

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


19

Modelo de terminao de tratamento


de excees
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 torn-
lo 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 // Fig. 13.2: DivideByZeroWithExceptionHandling.java 27
2 // Um exemplo de tratamento de excees que verifica a diviso por zero.
3 import java.util.InputMismatchException; Resumo
4 import java.util.Scanner;
5
6 public class DivideByZeroWithExceptionHandling
7 {
DivideByZeroWithEx
8 // demonstra lanamento de uma execeo quando ocorre uma diviso por zero ceptionHandling
9 public static int quotient( int numerator, int denominator )
10 throws ArithmeticException A clusula throws especifica que o .java
11 { quociente do mtodo talvez lance uma
12 return numerator / denominator; // possible ArithmeticException
division by zero
13 } // fim do mtodo quotient
14 (1 de 3)
15 public static void main( String args[] )
16 {
17 Scanner scanner = new Scanner( System.in ); // scanner para entrada
18 boolean continueLoop = true; // determina se mais entradas so necessrias
A instruo de repetio faz um loop at o
19
bloco catch completar com sucesso
20 do O bloco catch tenta ler a entrada
21 {
e realizar a diviso
22 try // l dois nmeros e calcula o quociente
23 {
24 System.out.print( "Please enter an integer numerator: " );
25 int numerator = scanner.nextInt();
26 System.out.print( "Please enter an integer denominator: " ); Recupera entrada;
27 int denominator = scanner.nextInt(); InputMismatchException
28 lanada se a entrada no tiver
inteiros vlidos

2005 by Pearson Education do Brasil


29 int result = quotient( numerator, denominator ); 28
30 System.out.printf( "\nResult: %d / %d = %d\n", numerator,
31 denominator, result );
uma ArithmeticException
Resumo
Chama o mtodo quotient, que pode lanar
32 continueLoop = false; // entrada bem-sucedida; fim de loop
33 } // fim de try Se alcanarmos esse ponto, a entrada era vlida e o
34 catch ( InputMismatchException inputMismatchException ) denominador era no zero, portanto o loop pode parar
DivideByZeroWithEx
35 {
ceptionHandling
Capturando uma InputMismatchException (usurio
36 System.err.printf( "\nException: %s\n",
37 inputMismatchException ); inseriu uma entrada de no-inteiro)
.java
38 scanner.nextLine(); // descarta entrada para o usurio de novo
Parmetros de exceo
39 System.out.println(
40 "You must enter integers. Please try again.\n" L
);a entrada invlida, porm no faz nada com ela
41 } // fim de catch
42 catch ( ArithmeticException arithmeticException )
(2 de 3)
43 {
Notifica o usurio de que ocorreu um erro
44 System.err.printf( "\nException: %s\n", arithmeticException );
45 System.out.println(
46 "Zero is an invalid denominator. Please try again.\n"
Capturando );
uma ArithmeticException (usurio inseriu
47 } // fim de catch zero para o denominador)
48 } while ( continueLoop ); // fim de do...while
49 } // fim de main
50 } // 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


29
Please enter an integer numerator: 100
Please enter an integer denominator: 7

Result: 100 / 7 = 14
Resumo

DivideByZeroWithEx
Please enter an integer numerator: 100
Please enter an integer denominator: 0 ceptionHandling

Exception: java.lang.ArithmeticException: / by zero .java


Zero is an invalid denominator. Please try again.

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


30

13.5 Quando utilizar o tratamento de


excees
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 no-
verificadas, 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


43

13.6 Hierarquia de excees do Java


(Continuao)
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


try 48
{
instrues Resumo
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


53

Lanando excees com a instruo


throw
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


1 // Fig. 13.5: UsingExceptions.java 62
2 // Demonstrao do tratamento de excees try...catch...finally
3 // mechanism. Resumo
4
5 public class UsingExceptions
6 {
UsingExceptions
7 public static void main( String args[] )
8 {
.java
9 try
10 {
11 throwException(); // chama mtodo throwException
12 } // fim de try
catch ( Exception exception ) // exceo
(1 de 3)
13 Chama lanada
o mtodopor throwException
que lana uma
14 {
exceo
15 System.err.println( "Exception handled in main" );
16 } // fim de catch
17
18 doesNotThrowException();
19 } // fim de main
20

2005 by Pearson Education do Brasil


21 // demonstra try...catch...finally 63
22 public static void throwException() throws Exception
23 { Resumo
24 try // lana uma exceo e imediatamente a captura
25 {
26 System.out.println( "Method throwException" ); UsingExceptions
27 throw new Exception(); // gera exceo
28 } // fim de try .java
29 Cria exceo
catch ( Exception exception ) // captura uma nova Exception
lanada em try e a lana
30 {
31 System.err.println(
32 "Exception handled in method throwException" );
(2 de 3)
33 throw exception; // lana novamente para processamento adicional
34
35 // qualquer cdigo aqui no seriaLana
alcanado
uma Exception previamente
36 criada
37 } // fim de catch
38 finally // executa independentemente do que ocorre em try...catch
39 {
40 System.err.println( "Finally
O bloco executed
finally in executa
throwException"
mesmo que);
41 } // fim de finally
uma exceo seja relanada no bloco
42
catch
43 // qualquer cdigo aqui no seria atingido, exceo lanada de novo em catch
44

2005 by Pearson Education do Brasil


45 } // fim do mtodo throwException 64
46
47 // demonstra finally quando no ocorre nenhuma exceo Resumo
48 public static void doesNotThrowException()
49 {
50 try // bloco try no lana uma exceo
51 {
UsingExceptions
52 System.out.println( "Method doesNotThrowException" );
53 } // fim de try
.java
54 catch ( Exception exception ) // no executa
55 {
56 System.err.println( exception );
57 } // fim de catch (3 de 3)
58 finally // executa independentemente do que ocorre em try...catch
59 {
60 System.err.println(
O bloco finally executa mesmo que
61 "Finally executed in doesNotThrowException" );
62 } // fim de finally nenhuma exceo seja lanada
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


1 // Fig. 13.6: UsingExceptions.java 66
2
3
// Demonstrao do desempilhamento. Resumo
4 public class UsingExceptions
5 {
UsingExceptions
6 public static void main( String args[] )
7 {
.java
8 try // chama throwException para o
Chama demonstrar o desempilhamento
mtodo que lana uma
9 { exceo
10 throwException();
11 } // fim de try (1 de 2)
12 catch ( Exception exception ) // exceo lanada em throwException
13 {
14 System.err.println( "ExceptionCaptura
handleda in
exceo
main" que
); poderia ocorrer no
15 } // fim de catch bloco try anterior, incluindo a
16 } // fim de main chamada ao mtodo
17 throwException

2005 by Pearson Education do Brasil


18 // throwException lana exceo que no capturada nesse mtodo 67
19 public static void throwException() throws Exception
20 { Resumo
21 try // lana uma exceo e a captura em main O mtodo lana uma exceo
22 {
23 System.out.println( "Method throwException" ); UsingExceptions
24 throw new Exception(); // gera a exceo
25 } // fim de try .java
26 Lana
catch ( RuntimeException runtimeException ) // nova exceo;
captura exceo
tipo incorreto no
27 { capturada no bloco try atual, portanto
28 System.err.println( tratada no bloco try externo
29 "Exception handled in method throwException" ); (2 de 2)
30 } // fim de catch
31 finally // o bloco bloco finally
O finally executa
sempre executa antes de
32 { retornar o controle ao bloco try
33 externo
System.err.println( "Finally is always executed" );
34 } // fim de finally
35 } // 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


68

13.9 printStackTrace,
getStackTrace e getMessage
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


71

13.9 printStackTrace,
getStackTrace e getMessage
(Continuao)
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


1 // Fig. 13.7: UsingExceptions.java 72
2 // Demonstrando GetMessage e printStackTrace a partir da classe Exception.
3 Resumo
4 public class UsingExceptions
5 {
6 public static void main( String args[] ) UsingExceptions
Chamada ao mtodo1, mtodo1 chama o
7 {
8 try
mtodo2, o mtodo2 chama o .java
9 {
mtodo3 e o mtodo3 lana uma nova
10 method1(); // chama method1 Exception
11 } // fim de try
Exibe a string descritiva da
12
exceo lanada no (1
catch ( Exception exception ) // captura exceo lanada em method1
mtodo3
de 3)
13 {
14 System.err.printf( "%s\n\n", exception.getMessage() );
15
Recupera as informaes na pilha
exception.printStackTrace(); // imprime rastreamento de pilha da exceo
16 como um array dos objetos
17 // obtm informaes de rastreamento de pilha StackTraceElement
18 StackTraceElement[] traceElements = exception.getStackTrace();
19

Exibe o rastreamento de pilha da


exceo lanada no mtodo3

2005 by Pearson Education do Brasil


20 System.out.println( "\nStack trace from getStackTrace:" ); 73
21 System.out.println( "Class\t\tFile\t\t\tLine\tMethod" ); Recupera o nome de classe do
22 Resumo
StackTraceElement atual
23 // faz um loop por traceElements para obter a descrio da exceo
24 for ( StackTraceElement element : traceElements ) Recupera o nome de arquivo do
25 { StackTraceElement atual
UsingExceptions
26 System.out.printf( "%s\t", element.getClassName() ); Recupera o nmero da linha do
27 System.out.printf( "%s\t", element.getFileName() ); .java
StackTraceElement atual
28 System.out.printf( "%s\t", element.getLineNumber() );
29 System.out.printf( "%s\n", element.getMethodName() );Recupera o nome de mtodo do
30 } // fim de for StackTraceElement atual
31 } // fim de catch (2 de 3)
32 } // fim de main mtodo1 chama mtodo2, mtodo2
33 chama mtodo3 e este lana uma
34 // chama method2; lana excees de volta para main Exception
35 public static void method1() throws Exception
36 {
37 method2();
38 } // fim do mtodo method1
39

2005 by Pearson Education do Brasil


40 // chama method3; lana excees de volta para method1 74
41 public static void method2() throws Exception
42 { Resumo
mtodo2 chama mtodo3, que lana uma
43 method3(); Exception
44 } // fim do mtodo method2
45 UsingExceptions
46 // lana Exception de volta para method2
47 public static void method3() throws Exception Exceo criada e lanada
.java
48 {
49 throw new Exception( "Exception thrown in method3" );
50 } // fim do mtodo method3
51 } // fim da classe UsingExceptions (3 de 3)
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 Line Method
UsingExceptions UsingExceptions.java 49 method3
UsingExceptions UsingExceptions.java 43 method2
UsingExceptions UsingExceptions.java 37 method1
UsingExceptions UsingExceptions.java 10 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


1 // Fig. 13.8: UsingChainedExceptions.java 77
2 // Demonstrando excees encadeadas.
3 Resumo
4 public class UsingChainedExceptions
5 {
6 public static void main( String args[] ) UsingChainedExcept
7 { ions.java
8 try
9 { Captura a exceo no method1
(1 debem
3)
10 method1(); // chama method1 como quaisquer excees encadeadas
11 } // fim de try associadas
12 catch ( Exception exception ) // excees lanadas de method1
13 {
14 exception.printStackTrace();
15 } // fim de catch
16 } // fim de main
17

2005 by Pearson Education do Brasil


18 // chama method2; lana excees de volta para main 78
19 public static void method1() throws ExceptionW
20 { Resumo
21 try
22 { Captura a exceo no method2, lana uma nova
23 method2(); // chama method2 exceo a ser encadeada com excees anteriores
UsingChainedExcept
24 } // fim de try ions.java
25 catch ( Exception exception ) // exceo lanada de method2
26 { (2 de 3)
27 throw new Exception( "Exception thrown in method1", exception );
28 } // fim de try
29 } // 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 { Captura a exceo no method3, lana uma nova
36 method3(); // chama method3 exceo a ser encadeada com excees anteriores
37 } // fim de try
38 catch ( Exception exception ) // exceo lanada de method3
39 {
40 throw new Exception( "Exception thrown in method2", exception );
41 } // fim de catch
42 } // fim do mtodo method2
43

2005 by Pearson Education do Brasil


44 // lana Exception novamente para method2 79
45 public static void method3() throws Exception
46 { Resumo
47 throw new Exception( "Exception thrown in method3" );
48 } // 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) (3 de 3)
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

2005 by Pearson Education do Brasil


80

13.11 Declarando novos tipos de


exceo
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 ps-
condies em um comentrio antes da declarao
de mtodo.

2005 by Pearson Education do Brasil


87

13.12 Precondies e ps-condies


(Continuao)
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 ps-
condies 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 // Fig. 13.9: AssertTest.java 90
2 // Demonstra a instruo assert
3 import java.util.Scanner; Resumo
4
5 public class AssertTest
6 {
AssertTest.java
7 public static void main( String args[] )
8 {
9 Scanner input = new Scanner( System.in );
10
11 System.out.print( "Enter a number between 0 and 10: " );
12 int number = input.nextInt(); A mensagem a ser exibida com o
13
Instruo assert AssertionError
14 // afirma que o valor absoluto > = 0
15 assert ( number >= 0 && number <= 10 ) : "bad number: " + number;
16
17 System.out.printf( "You entered %d\n", number );
18 } // fim de main
Se o nmero for menor que 0 ou maior
19 } // fim da classe AssertTest que 10, um AssertionError
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