310 likes | 392 Views
Linguagem II. Exceções. Revisão. Herança Construtores Sobrescrição de métodos Classes Abstratas métodos abstratos. Interfaces implements Polimorfismo. Tratamento de Erros. Robustez
E N D
Linguagem II Exceções
Revisã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 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 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 {dpr@cin.ufpe.br}
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 {dpr@cin.ufpe.br}
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); returntrue; } else { //Erro! return false; } } Davi Pires {dpr@cin.ufpe.br}
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 {dpr@cin.ufpe.br}
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 {dpr@cin.ufpe.br}
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 {dpr@cin.ufpe.br}
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 {dpr@cin.ufpe.br}
Exceções • Devem estender Exception publicclass MinhaExcecao extends Exception { public MinhaExcecao( ) { super(“Erro! Minha exceção!”); } } publicclass OutraExcecao extends Exception { } Davi Pires {dpr@cin.ufpe.br}
Exceções • Exemplo: • SaldoInsuficienteException.java • ContaDestinoNulaException.java Davi Pires {dpr@cin.ufpe.br}
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 {dpr@cin.ufpe.br}
Exceções • Exemplo: • OperacaoAbortadaException.java Davi Pires {dpr@cin.ufpe.br}
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 {dpr@cin.ufpe.br}
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 {dpr@cin.ufpe.br}
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 {dpr@cin.ufpe.br}
Exceções e métodos metodoA( ) metodoB( ) metodoC( ) Exceção Davi Pires {dpr@cin.ufpe.br}
Exceções e métodos • Relançando exceções • cláusula throws • Tratando exceções • blocos try-catch-finally. Davi Pires {dpr@cin.ufpe.br}
Cláusula throws • Na assinatura do método. • Especifica quais exceções ele lança. public void transferir(double valor, Conta destino) { if( destino != null ) { //ação... } else { //Erro! throw new ContaDestinoNulaException( ); } } 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 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 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-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çõ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çõ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 {dpr@cin.ufpe.br}
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!”); } 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ções • Exemplo: • ./contas/CadastroContas.java Davi Pires {dpr@cin.ufpe.br}
Dúvidas Davi Pires {dpr@cin.ufpe.br}
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 {dpr@cin.ufpe.br}
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 {dpr@cin.ufpe.br}
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.