Programação Orientada a Objetos Prof. Kléber de Oliveira Andrade pdjkleber@gmail.com
Tratamento de Exceções Quem pensa pouco, erra muito Leonardo da Vinci
Exceções!!! 12/09/2011 Prof. Kléber de Oliveira Andrade 3
Exceções Uma exceção representa uma situação que normalmente não ocorre e representa algo de estranho ou errado no sistema. 1. Erros de lógica de programação Ex: limites do vetor ultrapassados, divisão por zero Devem ser corrigidos pelo programador 2. Erros devido a condições do ambiente de execução Ex: arquivo não encontrado, rede fora do ar, etc. Fogem do controle do programador contornados em tempo de execução mas podem ser 3. Erros graves onde não adianta tentar tecuperar Ex: falta de memória, erro interno do JVM Fogem do controle contornados do programador e não podem ser 12/09/2011 Prof. Kléber de Oliveira Andrade 4
Exercício para começar com os conceitos 12/09/2011 Prof. Kléber de Oliveira Andrade 5
Rastro da pilha (stacktrace) 12/09/2011 Prof. Kléber de Oliveira Andrade 6
Como funcionam as exceções Quando um método é invocado ele é colocado na pilha onde são inseridos os métodos em execução na ordem em que foram chamados. Sempre que um método termina a sua execução ele é desempilhado e o fluxo do programa volta para o método anterior, ou para aquele que está no topo da pilha. Quando uma exceção é lançada em um método e não é tratada, este método é interromido e a execeção se propaga para o próximo método na pilha de execuções. Desta forma, enquanto uma exceção não for tratada, ela irá ser repassada para um nível abaixo da pilha até chegar ao método main. O método main que representa o primeiro método a ser chamado em qualquer programa é a última alternativa para que ocorra captura e tratamento de uma exceção lançada, pois caso contrário o programa será encerrado. void main(string[] args){... método1();... } void metodo1(){ metodo2(); } void metodo2(){... } stackframe (gomo da pilha) stack (pilha de execução) metodo2() metodo1() main() 12/09/2011 Prof. Kléber de Oliveira Andrade 7
Controle de erros com Exceções Exceções são: Erros de tempo de execução Objetos criados a partir de classes especiais que são lançados quando ocorrem condições excepcionais. Métodos podem capturar ou deixar passar exceções que ocorrerem em seu corpo É obrigatório, para a maior parte das exceções, que o método declare quaisquer exceções que ele não capturar Mecanismo try/catch é usado para tentar capturar exceções enquanto elas passam por métodos 12/09/2011 Prof. Kléber de Oliveira Andrade 8
Controle de Erros (Exceções) O mecanismo de tratamento de erros em Java é feito pelas diretivas try, catch e finally. Podem existir múltiplos blocos catch no tratamento de erros. Cada um para um tipo específico de Exception. 12/09/2011 Prof. Kléber de Oliveira Andrade 9
Bloco try O bloco try tenta executar um bloco de código que pode causar exceções (erros). Deve ser seguido por: Um ou mais blocos catch ( TipoDeExecao ref ). E/ou um bloco finally. O bloco try não pode aparecer sozinho, devendo ser seguido por pelo menos um catch ou por um finally. 12/09/2011 Prof. Kléber de Oliveira Andrade 10
Bloco catch Blocos catch recebem um tipo de execção como argumento Se ocorrer uma exceção no try, ela irá descer pelos catch até encontrar um que declare capturar exceções de uma classe ou superclasse da exceção lançada. Apenas um dos blocos catch é executado. 12/09/2011 Prof. Kléber de Oliveira Andrade 11
Bloco finally O bloco finally contém instruções que devem ser executadas independentemente da ocorrência ou não de exceções. Exemplos disso são códigos de limpeza como fechamento de arquivos, liberação de recursos, etc. 12/09/2011 Prof. Kléber de Oliveira Andrade 12
Ex. 1 Colocando try/catch Pegando ArrayIndexOutOfBoundsException Fora do laço for. O que o código imprime agora? 12/09/2011 Prof. Kléber de Oliveira Andrade 13
Saída do Ex. 1 12/09/2011 Prof. Kléber de Oliveira Andrade 14
Ex. 2 Colocando try/catch Pegando ArrayIndexOutOfBoundsException Dentro do laço for. Qual a diferença? 12/09/2011 Prof. Kléber de Oliveira Andrade 15
Saída do Ex. 2 12/09/2011 Prof. Kléber de Oliveira Andrade 16
Ex. 3 Colocando try/catch Pegando ArrayIndexOutOfBoundsException Na chamada do metodo2() Qual a diferença? 12/09/2011 Prof. Kléber de Oliveira Andrade 17
Saída do Ex. 3 12/09/2011 Prof. Kléber de Oliveira Andrade 18
Ex. 3 Colocando try/catch Pegando ArrayIndexOutOfBoundsException Na chamada do metodo1() Qual a diferença? 12/09/2011 Prof. Kléber de Oliveira Andrade 19
Saída do Ex. 4 12/09/2011 Prof. Kléber de Oliveira Andrade 20
Como causar uma exceção? Uma exceção é um tipo de objeto que sinaliza que uma condição excepcional ocorreu A identificação (nome da classe) é sua parte mais importante Precisa ser criada com new e depois lançada com throw throw new IllegalArgumentException( Erro! ); 12/09/2011 Prof. Kléber de Oliveira Andrade 21
Exemplo: exceções com throw A função da chamada throw é lançar uma exceção assim que a mesma ocorre, deixando a cargo do método tratar possíveis erros de programação vindos da passagem errada de parâmetros. Neste caso, exibir uma simples mensagem de erro do tipo ArithmeticException é o bastante para apresentar o problema ao usuário. 12/09/2011 Prof. Kléber de Oliveira Andrade 22
Execuções e métodos Uma declaração throws (observe o s ) é obrigatória em métodos e construtores que deixam de capturar uma ou mais exceções que ocorrem em seu interior. public void metodo() throws Excecao1, Excecao2 {... } public Circulo() throws ExcecaoDeLimite {... } throws declara que o método pode provocar exceções do tipo declarado (ou de qualquer subtipo) A declaração abaixo declara que o método pode provocar qualquer exceção (nunca faça isto) Public void metodo() throws Exception {... } Métodos sobrepostos não podem provocar mais exceções que os métodos originais 12/09/2011 Prof. Kléber de Oliveira Andrade 23
Exemplo: exceções com throws A chamada do método calc(10, 0) é executada normalmente e o erro é retornado para a função chamadora, que em nosso caso seria o main. No entanto, o main não trata o erro, fazendo com que a JVM libere como saída o erro padrão de ArithmeticException. De forma a corrigir este problema e tornar o tratamento mais amigável ao usuário final, é necessário a utilização do throws em conjunto com as cláusulas try / catch(). 12/09/2011 Prof. Kléber de Oliveira Andrade 24
Exemplo: exceções com throws tyr/catch O corpo do try / catch() do método main trata possíveis erros a chamada do método calc(). Como nosso throws faz referência à exceção ArithmeticException, um catch() foi criado para imprimir uma mensagem para este tipo de exceção. No entanto, se o erro criado não for o bastante para debugar o problema, é possível imprimir junto a esse o erro padrão da API Java. 12/09/2011 Prof. Kléber de Oliveira Andrade 25
Controle de Erros (Exceções) Todo erro, ou condição especial, em Java é uma subclasse de Throwable. Porém existem 3 diferentes tipos de erros. Erro de Runtime (java.lang.runtime); Erro de Sistema (java.lang.error); Erro Customizado (java.lang.exception). Os erros de Runtime são causados por bugs do programa, que desconhecemos, ou seja, uma condição especial que sequer havíamos imaginado. Os erros de Runtime são subclasses de Exception. Os erros de sistema são erros imprevisíveis, causados por falha do sistema, como acesso a disco, erro do banco de dados e etc. Estes erros são subclasses da classe Error. E os erros Customizados são erros ou condições especiais previstas no programa. Esses erros são subclasses da classe Exception. 12/09/2011 Prof. Kléber de Oliveira Andrade 26
Hierarquia Exceções não checadas pelo compilador (erros de lógica) Condições excepcionais checadas pelo compilador (eventos recuperáveis) Object Throwable Erros não checados pelo compilador (eventos irrecuperáveis) Exception Error RuntimeException ClassCastException NullPointerException NumberFormatException ArrayIndexOutOfBoundsException... IOException FileNotFoundException MinhaExcecao SuaExcecao... OutOfMemoryError InternalError VirtulMachineErro UnknownError... Boas práticas: Prefira sempre usar as classes de exceções existentes na API antes de criar suas próprias exceções! 12/09/2011 Prof. Kléber de Oliveira Andrade 27
Outras Exceções: checked e unchecked! Java possui Checked Exceptions (Exceções checadas) que estendem java.lang.exception O compilador força o programador a capturar tais exceções Elas precisam fazer parte da assinatura dos métodos Java também possui Unchecked Exceptions (Exceções não checadas) que estendem java.lang.runtimeexception Essas exceções não precisam ser capturadas (mas podem sê-lo) A questão é: em que situação você deveria usar cada tipo de exceção? Há gente que advoga usar Checked Exceptions e outros que advogam o contrário Você vai ter que decidir, em cada situação 12/09/2011 Prof. Kléber de Oliveira Andrade 28
Criando uma Exceção A classe java.lang.throwable é a raiz da hierarquia de classes de exceções e de erros. Java.lang.Throwable define um método denominado getmessage() que retorna uma mensagem descritiva do problema ocorrido. Para definir um novo tipo de exceção crie uma classe que estenda a classe java.lang.throwable ou alguma de suas subclasses. Normalmente estende-se Exception ou RuntimeException. Defina atributos e métodos especificos da exceção. Para armazenar uma mensagem descritiva da exceção, defina um construtor da exceção que recebe uma String e invoca (direta ou indiretamente) o construtor correspondente da superclasse java.lang.throwable. 12/09/2011 Prof. Kléber de Oliveira Andrade 29
Exemplo: Criando uma Exceção Algumas sobrecargas dos construtores, não é necessário todos! 12/09/2011 Prof. Kléber de Oliveira Andrade 30
Principais métodos Construtores de Exception Exception() Exception (String message) Exception (String message, Throwable cause) Métodos de Exception String getmessage() Retorna mensagem passado pelo construtor Throwable getcause() Retorna exceção que causou esta exceção String tostring() Retorna o nome da exceção e mensagem Void printstacktrace() Imprime detalhes (stack trace) sobre exceção 12/09/2011 Prof. Kléber de Oliveira Andrade 31
Como cavar a própria cova Não tratar exceções e simplesmente declará-las em todos os métodos evita trabalho, mas torna o código menos robusto Mas o pior que um programador pode fazer é capturar exceções e fazer nada, permitindo que erros graves passem despercebidos e causem problemas dificílimos de localizar no futuro NUNCA escreva o seguinte código try { //... Código que pode causar exceções } catch ( Exception e ) { } Ele pega até NullPointerException, e não diz nada. O mundo se acaba, o programa trava ou funciona de modo estranho e ninguém saberá a causa a não ser que mande imprimir o valor de e, entre as chaves do catch. Pior que isto só se no lugar de Excepetion houver Throwable. 12/09/2011 Prof. Kléber de Oliveira Andrade 32
Por que usar exceções? Separam a parte de lógica do sistema da parte de tratamento de erros. Evitam a criação de um código específico para cada situação em que um tipo de erro ocorre. Concentram o tratamento de erros em partes específicas do código, facilitando a legibilidade e manutenção. 12/09/2011 Prof. Kléber de Oliveira Andrade 33
Exercício 1 Faça um programa que solicite dois números ao usuário e, em seguida, imprime o resultado da divisão do primeiro pelo segundo. Trate a exceção ArithmeticException. Teste o método getmessage e printstacktrace de Exception e observe o tipo de mensagem. 12/09/2011 Prof. Kléber de Oliveira Andrade 34
Exercício 2 Re-escreva o exercício 1 de maneira que os números que compõem a razão sejam recebidos pela linha de comando. Trate todas as exceções necessárias. Não esqueça de tratar os possíveis erros de entrada caso o usuário entre com caracteres inválidos. 12/09/2011 Prof. Kléber de Oliveira Andrade 35
Resumo Tratar: try {... } catch (TipoExcecao ex) {... } finally {... } Lançar: If (condicao) throw new MinhaExcecao( Voce só pode ser uma anta ); Propagar / deixar passar: public int buscalojas() throws MinhaExcecao() {... } Criar / Definir Public class MinhaExcecao extends Throwable {... } 12/09/2011 Prof. Kléber de Oliveira Andrade 36
Referências e Material Complementar http://blog.caelum.com.br/lidando-com-exceptions/ http://sergiotaborda.wordpress.com/desenvolvimento-desoftware/java/trabalhando-com-excecoes-conceitos/ http://sergiotaborda.wordpress.com/desenvolvimento-desoftware/java/excecoes-classes-utilitarias/ http://sergiotaborda.wordpress.com/desenvolvimento-desoftware/java/excecoes-boas-praticas-mas-praticas/ http://www.ibm.com/developerworks/java/library/j-jtp05254/index.html http://www.javalobby.org/java/forums/t16517.html 12/09/2011 Prof. Kléber de Oliveira Andrade 37