Post on 22-Apr-2015
Linguagem II
Exceções
Davi Pires {dpr@cin.ufpe.br}
RevisãoRevisão
• Herança– Construtores– Sobrescrição de métodos
• Classes Abstratas– métodos abstratos.
• Interfaces– implements
• Polimorfismo
Davi Pires {dpr@cin.ufpe.br}
Tratamento de ErrosTratamento 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 {dpr@cin.ufpe.br}
Tratamento de errosTratamento de erros
• Consolepublic 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 {dpr@cin.ufpe.br}
Tratamento de errosTratamento 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 {dpr@cin.ufpe.br}
Tratamento de errosTratamento 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 {dpr@cin.ufpe.br}
Tratamento de errosTratamento 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 {dpr@cin.ufpe.br}
Tratamento de errosTratamento 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 {dpr@cin.ufpe.br}
ExceçõesExceçõ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 {dpr@cin.ufpe.br}
A Classe ExceptionA 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 {dpr@cin.ufpe.br}
ExceçõesExceções
• Devem estender Exceptionpublic class MinhaExcecao extends Exception {
public MinhaExcecao( ) {super(“Erro! Minha exceção!”);
}}
public class OutraExcecao extends Exception {
}
Davi Pires {dpr@cin.ufpe.br}
ExceçõesExceções
• Exemplo:– SaldoInsuficienteException.java– ContaDestinoNulaException.java
Davi Pires {dpr@cin.ufpe.br}
ExceçõesExceçõ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 {dpr@cin.ufpe.br}
ExceçõesExceções
• Exemplo:– OperacaoAbortadaException.java
Davi Pires {dpr@cin.ufpe.br}
Tratamento de ErrosTratamento 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 {dpr@cin.ufpe.br}
Inserindo exceçõesInserindo 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 {dpr@cin.ufpe.br}
Inserindo exceçõesInserindo 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 {dpr@cin.ufpe.br}
Exceções e métodosExceções e métodos
metodoA( )
metodoB( )
metodoC( )
Exceção
Davi Pires {dpr@cin.ufpe.br}
Exceções e métodosExceções e métodos
• Relançando exceções– cláusula throws
• Tratando exceções– blocos try-catch-finally.
Davi Pires {dpr@cin.ufpe.br}
public void transferir(double valor, Conta destino) {if( destino != null ) {
//ação...} else {
//Erro!throw new ContaDestinoNulaException( );
}}
Cláusula throwsCláusula throws
• Na assinatura do método.
• Especifica quais exceções ele lança.
public void transferir(double valor, Conta destino) throws ContaDestinoNulaException {
if( destino != null ) {//ação...
} else {//Erro!throw new ContaDestinoNulaException( );
}}
Davi Pires {dpr@cin.ufpe.br}
Cláusula throwsClá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 {dpr@cin.ufpe.br}
Cláusula throwsClá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 {dpr@cin.ufpe.br}
Blocos try-catch-finallyBlocos 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 {dpr@cin.ufpe.br}
Tratando exceçõesTratando 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 {dpr@cin.ufpe.br}
Tratando exceçõesTratando exceções
• Exemplo: Conta.debitar(...);
Conta conta = new Conta(“123”, 15.0);try {
conta.debitar(10.0);conta.debitar(10.0);
} catch (SaldoInsuficienteException sie) {//TratamentoSystem.out.println(“Saldo insuficiente!”);
}
Davi Pires {dpr@cin.ufpe.br}
Tratando exceçõesTratando exceções
• Exemplo: Conta.transferir(...);
Conta conta = new Conta(“123”, 15.0);try {
conta.transferir(20.0, null);} catch (SaldoInsuficienteException sie) {
//TratamentoSystem.out.println(“Saldo insuficiente!”);
}
Conta conta = new Conta(“123”, 15.0);try {
conta.transferir(20.0, null);} catch (SaldoInsuficienteException sie) {
System.out.println(“Saldo insuficiente!”);} catch (ContaDestinoNulaException cdne) {
System.out.println(“Conta destino nula!”);}
Davi Pires {dpr@cin.ufpe.br}
Tratando exceçõesTratando exceções
• Exemplo:– ./contas/CadastroContas.java
Davi Pires {dpr@cin.ufpe.br}
DúvidasDúvidas
Davi Pires {dpr@cin.ufpe.br}
ExercíciosExercí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 {dpr@cin.ufpe.br}
ExercíciosExercí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.
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.