Tratamento de Exceções
Programação 3: Orientação a Objetos e Java
Classe de Contas: Descrição
class Conta {
private long numero;
private double saldo;
void debito (double valor) {
saldo = saldo - valor;
}
...
}
Como evitar débitos acima do limite permitido?
Desconsiderar Operação
class Conta {
private long numero;
private double saldo;
void debito (double valor) {
if (valor <= saldo) saldo = saldo - valor;
}
...
}
Mostrar Mensagem de Erro
class Conta {
private long numero;
private double saldo;
void debito (double valor) {
if (valor <= saldo)
saldo = saldo - valor;
else
System.out.print("Saldo Insuficiente!");
}
...
}
Retornar Código de Erro
class Conta {
private long numero;
private double saldo;
boolean debito (double valor) {
if (valor <= saldo) {
saldo = saldo - valor;
return true;
} else
return false;
}
...
}
Problemas
Desconsiderar operação: não tem como saber se a operação foi realizada; nenhuma informação é dada ao cliente.
Mensagem de erro: dependência entre a classe e sua interface com o usuário; não sinaliza erro para outros métodos.
Código de Erro: Problemas
class Conta {
...
boolean transfere(Conta conta, double v) {
boolean b = conta.debito(v);
if (b) {
this.credito(v);
return true;
} else
PPPPPPreturn false;
}
}
class Banco {
...
int debito(long num, double v) {
Conta c = this.procura(num);
if (c != null) {
boolean b = c.debito(v);
if (b) return 0;
else return 2;
} else return 1;
}
}
Exceções
Ao invés de códigos, teremos exceções...
São objetos comuns, portanto têm que ter uma classe associada
Classes representando exceções herdam e são subclasses de Exception (pré-definida)
Definindo Exceções
class SIException extends Exception {
double sc;
String nc;
SIException (double s, String n) {
super ("Saldo Insuficiente!");
sc = s;
nc = n;
}
}
Definindo Métodos com Exceções
class Conta {
private long numero;
private double saldo;
void debito (double valor) throws SIException {
if (valor <= saldo)
saldo = saldo - valor;
else throw new SIException(saldo,numero);
}
...
}
Definindo e Levantando Exceções
Res metodo(Args) throws E1, ..., EN {...}
Todos os tipos de exceções levantadas no corpo de um método devem ser declaradas na sua assinatura
Levantando exceções: throw obj-exceção
Usando Métodos com Exceções
class Conta {
...
void transfere(Conta conta, double v) throws SIException {
conta.debito(v);
this.credito(v);
}
}
Exceções levantadas indiretamente também devem ser declaradas!
Usando e Definindo Métodos com Exceções
class Banco {
...
void debito(long num, double v) throws SIException, CNEException {
Conta c = this.procura(num);
if (c != null) c.debito(v);
else throw new CNEException();
}
}
Tratando Exceções
try {
banco.debito(num,val); ...
}
catch (SIException sie) {
System.out.print(sie.getMessage());
System.out.print(" Conta/saldo: ");
System.out.print(sie.nc+"/"+sie.sc);
}
catch (CNEException cnee) {...}
Tratando Exceções
A execução do try termina assim que uma exceção é levantada
O primeiro catch de um (super) tipo da exceção é executado e o fluxo de controle passa para o código seguinte ao último catch
Tratando Exceções: Forma Geral
try {...}
catch (E1 e1) {...}
...
catch (En en) {...}
finally {...}
Tratando Exceções
Exceções em Banco
class Banco {
private Conta[] contas;
private int indice = 0;
void cadastro(Conta c) {
contas[indice] = c;
indice = indice + 1;
}
private Conta procura(long n) throws CNEException {
int i = 0;
boolean achou = false;
while ((! achou) && (i < indice)) {
if (contas[i].numero() == n) achou = true;
else i = i + 1;
}
if (achou == true) return contas[i];
else throw new CNEException();
}
void debito(long num, double val) throws SIException, CNEException {
Conta c = this.procura(num);
c.debito(val);
}
}
Exercícios
Modifique o sistema de controle de estoque para trabalhar com exceções.(Opcional)
Paulo Borba (phmb@di.ufpe.br) |