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

 

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

PPPPPP

return 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)

  • Define-se subclasses de Exception para oferecer informações extras sobre a falha, ou simplesmente para distinguir os vários tipos de falhas que podem ocorrer

 

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

  • Fluxo de controle e exceção são passados para a chamada do código contendo o comando throw, e assim por diante...

 

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

  • Se não houver nenhum catch compátivel, a exceção e o fluxo de controle são passados para a chamada do código com o try/catch

 

Tratando Exceções: Forma Geral

try {...}

catch (E1 e1) {...}

...

catch (En en) {...}

finally {...}

 

Tratando Exceções

  • O bloco finally é sempre executado, seja após a terminação normal do try, após a execução de um catch, ou até mesmo quando não existe nenhum catch compatível
  • Quando o try termina normalmente ou um catch é executado, o fluxo de controle é passado para o código seguindo o bloco finally (depois deste ser executado)

 

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

  1. Modifique o sistema de controle de estoque para trabalhar com exceções.(Opcional)

  2. Com base na nova definição de Conta usando exceções, indique o que precisa ser alterado nas classes Poupança e ContaEspecial para que elas também usem exceções.


Paulo Borba (phmb@di.ufpe.br)