Escolar Documentos
Profissional Documentos
Cultura Documentos
13
Tratamento de
exceo
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
13.1 Introduo
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.
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)
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.
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.
Result: 100 / 7 = 14
Resumo
DivideByZeroWithEx
Please enter an integer numerator: 100
Please enter an integer denominator: 0 ceptionHandling
Result: 100 / 7 = 14 (3 de 3)
Exception: java.util.InputMismatchException
You must enter integers. Please try again.
Result: 100 / 7 = 14
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.
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.
Observao de engenharia de
software 13.4
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.
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.
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.
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.
Figura 13.4 | A posio do bloco finally depois do ltimo bloco catch em uma instruo try.
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.
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.
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.
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.
Relanando excees
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
Method throwException
Finally is always executed
Exception handled in main
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.
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).
Observao de engenharia de
software 13.12
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.
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)
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).
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.