Sei sulla pagina 1di 25

Tratamento de Excees

Prof. Bruno Gomes


bruno.gomes@ifrn.edu.br

Programao Orientada a Objetos


Excees
Aplicaes, durante a execuo, podem
incorrer em muitas espcies de erros de vrios
graus de severidade
Quando mtodos so invocados sobre um
objeto:
Problemas de estado interno
Erros com objetos ou dados que eles manipulam
Ele pode estar violando seu contrato bsico
Excees

Acontece quando encontra algo inesperado:


Problemas no hardware Erro de entrada e sada (IO)
Arrays fora de faixa Erros da aplicao
Valores de variveis Saldo insuficiente
Diviso por zero Usurio no existe
Parmetros de mtodos Nota invalida
Falha de Memria
Excees
desagradvel encontrar erros
O que deve ser feito:
Notificar o usurio de um erro;
Conseguir salvar todo o trabalho
Permitir que usurios saiam elegantemente do
programa
Excees
Exceo um desvio no fluxo de execuo
normal do programa
Indica que houve problema na execuo de
um bloco do programa
Se no for tratado, programa pode parar
O uso correto de excees torna o programa
mais robusto e confivel
Excees
Quando um erro ocorre dentro de um mtodo:
Um objeto criado
O objeto contm informaes sobre o erro, assim
como o tipo e o estado do programa
A ao de capturar esse objeto chamamos de
throwing an exception
O ambiente de execuo (runtime system) tenta
encontrar algum tratamento a exceo
A busca segue a call stack lista de chamadas de
mtodos
Excees
Hierarquia de Excees em Java
Em Java, um objeto de exceo sempre uma
instncia de uma classe derivada Throwable
Hierarquia de Excees em Java
Error:
Ocorrem devido a problemas de SO ou hardware
No deve lanar um objeto desse tipo

Ao se fazer um programa Java, deve focalizar


na hierarquia Exception
Divide em dois ramos: As que derivam de
RuntimeException e as que no derivam
Hierarquia de Excees em Java
RuntimeException:
Acontece porque se fez um erro de programao
Exemplos:
Acesso de array proibido; acesso de ponteiro nulo.
Qualquer outra Exceo:
Ocorre porque algo ruim, como um erro de E/S,
aconteceu com o programa bom em outros aspectos
Exemplos:
Tentar ler alm do fim de um arquivo; tentar abrir um URL
malformado.
Tipos de Excees
A Java Language Specification define 2 tipos de
excees:
Exceo No Verificada (unchecked):
Deriva da classe Error ou da RuntimeException
No precisam ser tratadas, mas podem ser
NullPointerException, NumberFormatException,
ArrayIndexOutOfBoundsException
Se uma exceo no verificada ocorrer e no for tratada, o
programa pode parar (console)
Exceo Verificada (checked):
Excees previsveis
Devem ser tratadas pelo programa
Formas de Capturar
Atravs de uma clusula throws na assinatura
do mtodo
Ou atravs de uma bloco try
Formas de Capturar
Um mtodo deve informar que excees ele pode disparar
(throw)
clusula throws na definio do mtodo
Um bloco que tenta (try) chamar um mtodo que pode
disparar uma exceo deve trat-la
Chamada normal de um mtodo, mas que deve estar em um bloco
try{...} catch {...}
Uma exceo um objeto que deve ser capturado (catch)
nesse bloco que a exceo deve ser tratada
Um trecho de cdigo pode ser executado sempre
bloco finally
Tratando Excees
1 Forma: bloco try-catch-finally
Um bloco deve capturar uma exceo para trat-la
try {
// Executa cdigo
Tenta executar // que pode disparar exceo
} catch (Exception exception){
// Trata exceo
// exception uma referncia
Captura
// para objeto da
// classe Exception
} finally {
// Este bloco sempre
Sempre Executa // executado, independente de
// ocorrer exceo
}
Exemplo
Mtodo parseInt pode disparar exceo
NumberFormatException (no verificada)
Se a exceo for dispara os comandos do bloco try no sero mais
executados.
O fluxo de execuo muda para a captura (bloco catch)
Ela pode no ser tratada.
Programa encerra se for disparada
System.out.print("Digite um nmero");
String numero = sc.nextLine();
int x;
try{
x = Integer.parseInt(numero);
System.out.println("Numero digitado vlido");
} catch (NumberFormatException exception){
System.out.println("Digite um nmero vlido");
}
Catch
Pode haver mais de um bloco catch
Cada bloco trata um tipo especfico de exceo
O bloco try contm mtodos que podem disparar todas as
excees
Um mtodo pode disparar mais de uma exceo
try {
// bloco de comandos
} catch (Excecao1 ex1) {
// Trata exceo1
} catch (Excecao2 ex2) {
// Trata exceo2
} catch (Excecao3 ex3){
// Trata exceo3
}
Repassando a responsabilidade
Um mtodo pode repassar uma exceo
Ele chama um mtodo que dispara uma exceo,
mas no quer tratar
Ele pode repassar a exceo
Basta colocar a clusula throws na assinatura
do mtodo
Para quem chama, o mtodo que dispara a
exceo
Repassando a Responsabilidade

public void metodo() throws AlgumaException{


// Corpo do mtodo chama
// mtodo que dispara AlgumaException
obj.metodoQueDisparaExcecao();
public void qualquer(){ }
// alguma coisa
try {
metodo();
} catch (AlgumaException e) {
e.printStackTrace();
}
// mais coisa
}
Definindo Excees
1 Passo: Defina uma classe que herde de Exception
Ou RuntimeException se desejar fazer exceo no
verificada

public class ContatoNaoEncontradoException extends Exception {


public ContatoNaoEncontradoException()
{
super("Contato no encontrado");
}
}
Definindo Excees
2 Passo: No mtodo que dispara a exceo:
Coloque a clusua throws
Crie o objeto da classe de exceo
Dispare (throw) a exceo
Onde a exceo ser disparada depende de cada mtodo
public Contato buscar(String nome)
throws ContatoNaoEncontradoException{
// Laco para procurar contato pelo nome
for (int i = 0 ; i < quantidade ; i++)
if (contatos[i].nome().equals(nome))
return contatos[i];
// Se sair do lao e no tiver retornado
// o contato no esta cadastrado
// deve disparar excecao
throw new ContatoNaoEncontradoException();
}
Definindo Excees
3 Passo: Exceo tratada na interface com
usurio
private void buscarContato() {
System.out.print("Digite o nome: ");
String nome = sc.nextLine();
try {
Contato contato = agenda.buscar(nome);
System.out.println(contato);
} catch (ContatoNaoEncontradoException e) {
System.out.println("ERRO!!!!");
System.out.println(e.getMessage());
System.out.println("\nDigite [ENTER] para continuar....");
sc.nextLine();
}
}
Exerccio
Crie uma Classe CalculoMatematico
Nela, crie um mtodo divisao, que recebe como
parmetros os valores a serem divididos. O retorno o
resultado da diviso (todos os nmeros devem ser do tipo
inteiro)
Crie uma classe de teste para testar a
CalculoMatematico
Nela crie um objeto CalculoMatematico e acesse o mtodo
divisao, tentando dividir 4 por 0.
Execute a classe e veja o que acontece
Exerccio
Crie um bloco try...catch no metodo divisao
para tratar a operao realizada
No catch:
Informar o objeto do tipo ArithmeticException
Imprimir uma mensagem informando que a
operao no pode ser realizada
Retorna zero
Exerccio
Tire o bloco try...catch do mtodo divisao
Adicione throws ArithmeticException na assinatura do
mtodo
E na primeira linha do bloco do mtodo, faa uma verificao
se o divisor igual a 0
Se for, lance uma exceo
throw new ArithmeticException(Texto);
Na classe de teste, crie um bloco try...catch, tentando
executar o mtodo diviso
Catch para ArithmeticException
No bloco do Catch, imprima o mtodo getMessage() do objeto criado
do tipo ArithmeticException
Exerccio
Crie uma nova Classe
DivisorZeroException
Implemente da mesma forma do slide 19
Na Classe CalculoMatematico, troque
ArithmeticException por DivisorZeroException
throws DivisorZeroException
throw new DivisorZeroException();
Na classe de teste, troque no Catch
ArithmeticException por DivisorZeroException

Potrebbero piacerti anche