Professional Documents
Culture Documents
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
13.3
13.4
13.5
13.6
13.7
Bloco finally
13.8
Desempilhamento de pilha
13.9
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.
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.
Aprimora a modificabilidade.
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
19
20
21
22
23
24
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
11
Resumo
Result: 100 / 7 = 14
DivideByZeroNoExce
ptionHandling.java
(2 de 2)
12
13
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.
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.
16
17
18
19
20
21
22
23
24
25
26
1
2
3
import java.util.Scanner;
5
6
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
18
19
20
21
22
23
DivideByZeroWithEx
ceptionHandling
do
24
25
26
27
Recupera entrada;
System.out.print( "Please enter an integer denominator: " );
int denominator = scanner.nextInt();
InputMismatchException
28
29
30
31
32
33
34
35
36
37
38
39
40
{
System.err.printf( "\nException: %s\n",
DivideByZeroWithEx
ceptionHandling
Capturando uma InputMismatchException
(usurio
42
43
47
48
49
50
Resumo
41
44
45
46
28
(2 de 3)
Notifica o usurio de que ocorreu um erro
29
Resumo
DivideByZeroWithEx
ceptionHandling
.java
(3 de 3)
30
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.
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.
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.
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.
35
36
37
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.
39
40
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.
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
43
44
45
46
47
48
try
Resumo
instrues
instrues de aquisio de recurso
// fim de try
catch ( UmTipoDeExceo exceo1
}
// fim de catch
catch
OutroTipoDeExceo exceo2
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.
49
50
51
52
53
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.
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.
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.
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.
58
59
60
61
// mechanism.
62
Resumo
4
5
6
7
8
9
UsingExceptions
.java
10
11
12
13
14
15
16
17
18
19
20
(1 de 3)
exceo
doesNotThrowException();
} // fim de main
21
// demonstra try...catch...finally
22
23
63
24
25
26
27
Resumo
UsingExceptions
.java
28
} // fim de try
29
30
e a lana
System.err.println(
31
(2 de 3)
32
33
34
35
36
Exception previamente
criada
37
} // fim de catch
38
39
40
41
42
43
44
System.err.println( "Finally
in executa
throwException"
);
O bloco executed
finally
mesmo que
} // fim de finally
45
46
47
48
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
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
65
// Demonstrao do desempilhamento.
66
Resumo
3
4
UsingExceptions
.java
exceo
throwException();
10
11
} // fim de try
12
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
18
19
20
21
22
23
24
67
Resumo
O mtodo lana uma exceo
UsingExceptions
.java
25
} // fim de try
26
27
{
System.err.println(
28
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
13.9 printStackTrace,
getStackTrace e getMessage
68
69
70
13.9 printStackTrace,
getStackTrace e getMessage
(Continuao)
71
Mtodos StackTraceElement:
getClassName
getFileName
getLineNumber
getMethodName
72
3
4
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
8
9
10
11
14
15
16
17
18
19
20
21
System.out.println( "Class\t\tFile\t\t\tLine\tMethod" );
22
73
Resumo
23
24
25
26
27
28
29
30
} // fim de catch
31
32
} // fim de main
33
34
35
36
37
38
39
method2();
} // fim do mtodo method1
40
41
42
44
UsingExceptions
45
46
47
48
49
50
Resumo
method3();
43
74
(3 de 3)
Line
49
43
37
10
Method
method3
method2
method1
main
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.
76
77
Resumo
3
4
try
{
method1(); // chama method1
10
UsingChainedExcept
ions.java
11
} // fim de try
12
13
14
15
16
17
exception.printStackTrace();
} // fim de catch
} // fim de main
18
19
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
26
{
throw new Exception( "Exception thrown in method1", exception );
27
} // fim de try
28
29
(2 de 3)
30
31
32
33
34
try
35
{
method3(); // chama method3
36
37
} // fim de try
38
39
40
41
42
43
44
45
46
47
48
79
Resumo
UsingChainedExcept
Exceo original lanada
ions.java
(3 de 3)
80
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.
82
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).
85
86
87
Precondies
A condio que deve ser verdadeira quando o mtodo
invocado.
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
1
2
3
4
import java.util.Scanner;
6 {
7
8
9
10
11
12
13
14
15
90
Resumo
AssertTest.java
Instruo assert
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