Linguagem II
Exceções
Revisão
• Herança
– Construtores
– Sobrescrição de métodos
• Classes Abstratas
– métodos abstratos.
• Interfaces
– implements
• Polimorfismo
Davi Pires {[email protected]}
Tratamento de Erros
• Robustez
– “Capacidade de um sistema para continuar
funcionando mesmo com erros ou falhas
durante a execução do programa.”
• Como temos feito nosso tratamento de
erros?
Davi Pires {[email protected]}
Tratamento de erros
• Console
public void transferir(double valor, Conta destino) {
if( destino != null ) {
//ação...
destino.creditar(valor);
this.debitar(valor);
} else {
//Erro!
System.out.println(“Erro!”);
}
}
Davi Pires {[email protected]}
Tratamento de erros
• Problemas
– Código emaranhado.
• “macarrônico”...
– Erros não são vistos além do método.
• estado após o método é incerto.
• quem chamou não sabe se houveram erros.
– Single Responsibility Law violada.
Davi Pires {[email protected]}
Tratamento de erros
• “Sacrificar” o tipo de retorno.
public boolean transferir(double valor, Conta destino) {
if( destino != null ) {
//ação...
destino.creditar(valor);
this.debitar(valor);
return true;
} else {
//Erro!
return false;
}
}
Davi Pires {[email protected]}
Tratamento de erros
• Mais um exemplo.
public int transferir(double valor, Conta destino) {
if( destino != null ) {
//ação...
destino.creditar(valor);
this.debitar(valor);
return 0;
} else {
//Erro!
return 1;
}
}
Davi Pires {[email protected]}
Tratamento de erros
• Técnicas ad hoc.
• O que seria interessante?
– Separação de código.
– Preservação da assinatura dos métodos.
• Java fornece meios específicos para
declarar e tratar erros.
Davi Pires {[email protected]}
Exceções
• Classes que representem os possíveis
erros do sistema.
– geralmente, criadas pelos programadores.
• Partilham alguns comportamentos
comuns:
– podem ser “lançadas”.
– podem ser “interceptadas”.
– para depois serem “tratadas”.
Davi Pires {[email protected]}
A Classe Exception
•
•
•
•
package java.lang;
implements java.io.Serializable;
É a superclasse de todas as exceções.
Define construtores.
– Exception();
– Exception(String input);
– Exception(Throwable cause);
– Exception(Throwable cause, String input);
Davi Pires {[email protected]}
Exceções
• Devem estender Exception
public class MinhaExcecao extends Exception {
public MinhaExcecao( ) {
super(“Erro! Minha exceção!”);
}
}
public class OutraExcecao extends Exception {
}
Davi Pires {[email protected]}
Exceções
• Exemplo:
– SaldoInsuficienteException.java
– ContaDestinoNulaException.java
Davi Pires {[email protected]}
Exceções
• Também podem carregar informações
importantes sobre o erro ocorrido.
– Podem ter atributos e métodos próprios.
• Padrão de Codificação
– Nomes terminando com “Exception”.
• NullPointerException
• ArrayIndexOutOfBoundsException
Davi Pires {[email protected]}
Exceções
• Exemplo:
– OperacaoAbortadaException.java
Davi Pires {[email protected]}
Tratamento de Erros
• Inserindo exceções no código
– Como separar detecção de tratamento?
– Como avisar o método anterior?
– Como manter a SRL?
• Exceções são lançadas usando a
cláusula throw.
Davi Pires {[email protected]}
Inserindo exceções
• “Pontos de erro”
public void transferir(double valor, Conta destino) {
if( destino != null ) {
//ação...
destino.creditar(valor);
this.debitar(valor);
} else {
//Erro!
throw new ContaDestinoNulaException( );
}
}
Davi Pires {[email protected]}
Inserindo exceções
• A cláusula throw
• Interrompe a execução do método
– “unreachable statements”
public void transferir(double valor, Conta destino) {
if( destino != null ) {
//ação...
} else {
//Erro!
throw new ContaDestinoNulaException( );
System.out.println(“erro!”);
}
}
Davi Pires {[email protected]}
Exceções e métodos
metodoA( )
metodoB( )
metodoC( )
Exceção
Davi Pires {[email protected]}
Exceções e métodos
• Relançando exceções
– cláusula throws
• Tratando exceções
– blocos try-catch-finally.
Davi Pires {[email protected]}
Cláusula throws
• Na assinatura do método.
• Especifica quais exceções ele lança.
public void transferir(double valor, Conta destino) {
throws
if( destino
ContaDestinoNulaException
!= null ) {
{
if( destino
//ação...
!= null ) {
} else { //ação...
} else { //Erro!
throw new ContaDestinoNulaException( );
//Erro!
}
throw new ContaDestinoNulaException( );
}
}
}
Davi Pires {[email protected]}
Cláusula throws
• Em interfaces, também devem ser
declaradas as exceções lançadas pelo
método.
• Uma hierarquia de exceções que um
método lança pode ser resumida em
uma única exceção.
– java.lang.Exception
Davi Pires {[email protected]}
Cláusula throws
• Exemplo:
– Conta.java
– RepositorioContas.java
• Exercício
– Altere as classes de Conta* da aula passada
para que eles lancem as seguintes exceções:
• ContaNulaException, ao inserir uma conta cujo
valor seja null.
• RepositorioVazioException, ao tentar imprimir o
conteúdo de um repositório vazio.
• Altere o método main e teste!
Davi Pires {[email protected]}
Blocos try-catch-finally
• Exceções devem ser tratadas tão cedo
possível.
• Não podem chegar à JVM.
• Tratamento é feito com blocos
– try-catch-finally
• Permitem o tratamento individual de
cada exceção.
Davi Pires {[email protected]}
Tratando exceções
try {
código que lança exceções.
} catch ( NomeDaExcecao nomeDaVariavel ) {
//Tratamento da exceção
} catch (NomeDeOutraExcecao outroVariavel)
//Outro tratamento de exceção
} catch ..
//Tantos blocos catch quanto necessários
} finally {
// SEMPRE é executado
}
Davi Pires {[email protected]}
Tratando exceções
• Exemplo: Conta.debitar(...);
Conta conta = new Conta(“123”, 15.0);
try {
conta.debitar(10.0);
conta.debitar(10.0);
} catch (SaldoInsuficienteException sie) {
//Tratamento
System.out.println(“Saldo insuficiente!”);
}
Davi Pires {[email protected]}
Tratando exceções
• Exemplo: Conta.transferir(...);
Conta conta = new Conta(“123”, 15.0);
try {
conta.transferir(20.0, null);
} catch (SaldoInsuficienteException sie) {
//Tratamento
System.out.println(“Saldo insuficiente!”);
} catchSystem.out.println(“Saldo
(ContaDestinoNulaException
insuficiente!”);
cdne) {
}
System.out.println(“Conta destino nula!”);
}
Davi Pires {[email protected]}
Tratando exceções
• Exemplo:
– ./contas/CadastroContas.java
Davi Pires {[email protected]}
Dúvidas
Davi Pires {[email protected]}
Exercícios
• Escreva um repositório de X que tenha dois
métodos public:
– void inserir(X novoX)
• throws ArrayCheioException
– void duplicarArray( )
• throws ArrayNaoCompletoException
• Escreva uma classe CadastroX, chame os
métodos do repositório repassando as
exceções.
• Faça um método main para testar!
– Trate as exceções com try-catch no main.
Davi Pires {[email protected]}
Exercícios
• Operações matemáticas inválidas em
Java lançam ArithmeticException.
– e.g. divisão por zero.
• Faça um programa em que os usuários
insiram repetidamente os operandos de
operações matemáticas.
– Trate o caso de uma operação inválida.
Davi Pires {[email protected]}
Este trabalho está licenciado sob uma Licença Creative Commons Atribuição-Uso
Não-Comercial-Compatilhamento pela mesma licença. Para ver uma cópia desta
licença, visite http://creativecommons.org/licenses/by-nc-sa/2.0/br/ ou envie uma
carta para Creative Commons, 559 Nathan Abbott Way, Stanford, California 94305,
USA.
Download

Linguagem II