A maior rede de estudos do Brasil

Grátis
118 pág.
poojava

Pré-visualização | Página 10 de 37

A sinalização da exceção é propagada a partir do bloco de código onde ela ocorreu através de
toda a pilha de invocações de métodos até que a exceção seja capturada por um bloco manipulador
de exceção. Eventualmente, se tal bloco não existir em nenhum ponto da pilha de invocações de
métodos, a sinalização da exceção atinge o método main(), fazendo com que o interpretador Java
apresente uma mensagem de erro e aborte sua execução.
2.6.1 Tratamento de exceções
A captura e o tratamento de exceções em Java se dá através da especificação de blocos try,
catch e finally, definidos através destas mesmas palavras reservadas da linguagem.
A estruturação desses blocos obedece à seguinte sintaxe:
try {
// código que inclui comandos/invocações de métodos
// que podem gerar uma situação de exceção.
}
catch (XException ex) {
// bloco de tratamento associado à condição de
// exceção XException ou a qualquer uma de suas
// subclasses, identificada aqui pelo objeto
// com referência ex
}
catch (YException ey) {
// bloco de tratamento para a situação de exceção
// YException ou a qualquer uma de suas subclasses
}
finally {
// bloco de código que sempre será executado após
// o bloco try, independentemente de sua conclusão
// ter ocorrido normalmente ou ter sido interrompida
}
onde XException e YException deveriam ser substituídos pelo nome do tipo de exceção. Os
blocos não podem ser separados por outros comandos — um erro de sintaxe seria detectado pelo
compilador Java neste caso. Cada bloco try pode ser seguido por zero ou mais blocos catch, onde
cada bloco catch refere-se a uma única exceção.
O bloco finally, quando presente, é sempre executado. Em geral, ele inclui comandos que
liberam recursos que eventualmente possam ter sido alocados durante o processamento do bloco try
e que podem ser liberados, independentemente de a execução ter encerrado com sucesso ou ter sido
interrompida por uma condição de exceção. A presença desse bloco é opcional.
Alguns exemplos de exceções já definidas no pacote java.lang incluem:
ArithmeticException: indica situações de erros em processamento aritmético, tal como uma divisão
inteira por 0. A divisão de um valor real por 0 não gera uma exceção (o resultado é o valor
infinito);
c
�
2001 FEEC/UNICAMP 30
Programação orientada a objetos com Java 2.6. Exceções
NumberFormatException: indica que tentou-se a conversão de uma string para um formato numé-
rico, mas seu conteúdo não representava adequadamente um número para aquele formato. É
uma subclasse de IllegalArgumentException;
IndexOutOfBounds: indica a tentativa de acesso a um elemento de um agregado aquém ou além dos
limites válidos. É a superclasse de ArrayIndexOutOfBoundsException, para arranjos,
e de StringIndexOutOfBounds, para strings;
NullPointerException: indica que a aplicação tentou usar uma referência a um objeto que não foi
ainda definida;
ClassNotFoundException: indica que a máquina virtual Java tentou carregar uma classe mas não
foi possível encontrá-la durante a execução da aplicação.
Além disso, outros pacotes especificam suas exceções, referentes às suas funcionalidades. Por
exemplo, no pacote java.io define-se IOException, que indica a ocorrência de algum tipo de
erro em operações de entrada e saída. É a superclasse para condições de exceção mais específicas des-
se pacote, tais como EOFException (fim de arquivo ou stream), FileNotFoundException
(arquivo especificado não foi encontrado) e InterruptedIOException (operação de entrada
ou saída foi interrompida).
Uma exceção contém pelo menos uma string que a descreve, que pode ser obtida pela aplica-
ção do método getMessage(), mas pode eventualmente conter outras informações. Por exemplo,
InterruptedIOException inclui um atributo público do tipo inteiro, bytesTransferred,
para indicar quantos bytes foram transferidos antes da interrupção da operação ocorrer. Outra in-
formação que pode sempre ser obtida de uma exceção é a seqüência de métodos no momento da
exceção, obtenível a partir do método printStackTrace().
Como exceções fazem parte de uma hierarquia de classes, exceções mais genéricas (mais próxi-
mas do topo da hierarquia) englobam aquelas que são mais específicas. Assim, a forma mais genérica
de um bloco try-catch é
try { ... }
catch (Exception e) { ... }
pois todas as exceções são derivadas de Exception. Se dois blocos catch especificam exceções
em um mesmo ramo da hierarquia, a especificação do tratamento da exceção derivada deve preceder
aquela da mais genérica.
2.6.2 Erros e exceções de runtime
Exceções consistem de um caso particular de um objeto da classe Throwable. Apenas objetos
dessa classe ou de suas classes derivadas podem ser gerados, propagados e capturados através do
mecanismo de tratamento de exceções.
Além de Exception, outra classe derivada de Throwable é a classe Error, que é a raiz
das classes que indicam situações que a aplicação não tem como ou não deve tentar tratar. Usual-
mente indica situações anormais, que não deveriam ocorrer. Entre os erros definidos em Java, no
pacote java.lang, estão StackOverflowError e OutOfMemoryError. São situações on-
de não é possível uma correção a partir de um tratamento realizado pelo próprio programa que está
executando.
c
�
2001 FEEC/UNICAMP 31
Programação orientada a objetos com Java 2.6. Exceções
Há também exceções que não precisam ser explicitamente capturadas e tratadas. São aquelas
derivadas de RuntimeException, uma classe derivada diretamente de Exception. São exce-
ções que podem ser geradas durante a operação normal de uma aplicação para as quais o compilador
Java não irá exigir que o programador proceda a algum tratamento (ou que propague a exceção, como
descrito na Seção 2.6.3). Entre essas incluem-se ArithmeticException,IllegalArgumen-
tException, IndexOutOfBoundsException e NullPointerException.
2.6.3 Propagando exceções
Embora toda exceção que não seja derivada de RuntimeException deva ser tratada, nem
sempre é possível tratar uma exceção no mesmo escopo do método cuja invocação gerou a exceção.
Nessas situações, é possível propagar a exceção para um nível acima na pilha de invocações.
Para tanto, o método que está deixando de capturar e tratar a exceção faz uso da cláusula throws
na sua declaração:
void métodoQueNãoTrataExceção() throws Exception {
invoca.métodoQuePodeGerarExceção();
}
Nesse caso, métodoQueNãoTrataExceção() reconhece que em seu corpo há a possibili-
dade de haver a geração de uma exceção mas não se preocupa em realizar o tratamento dessa exceção
em seu escopo. Ao contrário, ele repassa essa responsabilidade para o método anterior na pilha de
chamadas.
Eventualmente, também o outro método pode repassar a exceção adiante. Porém, pelo menos no
método main() as exceções deverão ser tratadas ou o programa pode ter sua interpretação inter-
rompida.
2.6.4 Definindo e gerando exceções
Exceções são classes. Assim, é possível que uma aplicação defina suas próprias exceções através
do mecanismo de definição de classes.
Por exemplo, considere que fosse importante para uma aplicação diferenciar a condição de divi-
são por zero de outras condições de exceções artiméticas. Neste caso, uma classe DivideByZe-
roException poderia ser criada:
public class DivideByZeroException
extends ArithmeticException {
public DivideByZeroException() {
super("O denominador na divisão inteira tem valor zero");
}
}
Neste caso, o argumento para o construtor da superclasse especifica a mensagem que seria im-
pressa quando o método getMessage() fosse invocado para essa exceção. Essa é a mesma men-
sagem que é apresentada para um RuntimeException que não é capturado e tratado.
c
�
2001 FEEC/UNICAMP 32
Programação orientada a objetos com Java 2.7. O ambiente de Java
Para gerar uma condição de exceção durante a execução de um método, um objeto dessa classe
deve ser criado e,