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.