Programação com Objectos Processamento de Dados I 5. Excepções 1 5. Excepções | O que é uma excepção? | Tratamento de excepções: Try e Catch | Lançamento de excepções: Throw e Throws | Classes de excepção Programação com Objectos / Processamento de Dados I 2 5. Excepções | O que é uma excepção? z Uma excepção (exception) é um sinal gerado pela máquina virtual de Java (JVM), portanto, em tempo de execução do programa, e que é comunicado ao programa indicando a ocorrência de um erro recuperável. z Um erro (error) em Java corresponde a uma situação para a qual nenhuma recuperação é já possível (excepto o erro ThreadDeath), limitando o interpretador de Java a enviar uma mensagem de erro e a terminar o programa. z Excepções mais comuns: • Tentativa de divisão por zero (Division by zero); • Indexação para além dos limites de um array (Index out of bounds) Programação com Objectos / Processamento de Dados I 3 5. Excepções | O que é uma excepção? z As excepções podem ser tratadas de formas diversas: • Termina o programa com mensagem de aviso e impressão do estado (inaceitável para sistemas críticos). • Geridas em locais específicos, designados por manipuladores (handlers). z A linguagem Java coloca ao dispor do programador mecanismos que permitem: • Definir quais as excepções que devem ser detectadas num dado contexto do programa; • Definir quais as acções que se pretendem ver executadas em tais situações; • Definir as excepções a serem lançadas pelo próprio código do programa em certas condições. Programação com Objectos / Processamento de Dados I 4 5. Excepções Tratamento de excepções | No Java, uma excepção é um objecto da classe Exception, derivada de Throwable. | A gestão de excepções é feita nos seguintes passos: 1.Delimitar código onde podem ser geradas excepções (numa cláusula try). 2.Se for detectada situação anómala, lançar uma excepção (numa cláusula throw). 3.Inserir manipulador para as excepções lançadas (numa cláusula catch). Programação com Objectos / Processamento de Dados I 5 5. Excepções Tratamento de excepções | Formato típico dos métodos de tratamento: Programação com Objectos / Processamento de Dados I 6 5. Excepções Tratamento de excepções | Uma cláusula try tem de ter pelo menos uma cláusula catch, ou finally. | Podem estar associadas a uma cláusula try qualquer número de cláusulas catch, incluindo zero, desde que cada cláusula apanhe diferentes tipos de excepções. | O corpo do try é executado até que, ou uma excepção é lançada, ou o corpo do termina com sucesso. | Se uma excepção é lançada, cada cláusula catch é examinada, da primeira para a última, até que se encontre uma cujo tipo da excepção tratada seja compatível com a excepção lançada. Programação com Objectos / Processamento de Dados I 7 5. Excepções Tratamento de excepções | Se a cláusula catch é encontrada, é executado o seu corpo. Mais nenhuma cláusula é executada. | Se nenhuma cláusula catch é encontrada, a excepção passa para fora da cláusula try, até que uma próxima cláusula try possivelmente trate a excepção lançada. | Não é possível definir numa cláusula catch para apanhar excepções duma superclasse, antes duma cláusula duma subclasse. z z A primeira cláusula catch apanharia sempre a excepção, e a segunda cláusula catch nunca seria atingida. O compilador dá erro em tal situação. Programação com Objectos / Processamento de Dados I 8 5. Excepções Tratamento de excepções | Se o try tem uma cláusula finally, o seu código é executado após todo o processamento no try estar completo (independentemente de o ter feito normalmente, através do lançamento de uma excepção, ou com instruções return ou break). | Apenas uma excepção é tratada numa cláusula try. Se uma cláusula catch ou finally lançarem outra excepção, as cláusulas catch da cláusula try não são reexaminadas. z z As cláusulas catch e finally encontram-se fora da protecção da correspondente cláusula try. Tais excepções poderão, contudo, vir a ser tratadas noutra cláusula try. Programação com Objectos / Processamento de Dados I 9 5. Excepções Tratamento de excepções | Tipicamente, no tratamento são executadas as seguintes acções: z z z | Registar mensagem de erro. Recuperar o estado do objecto. Invocar novamente o método de onde foi gerada a excepção. Se o programa gerar uma excepção, e no código não se indicar o bloco catch para tratamento da excepção, o JVM: z z Aborta execução do programa. Imprime no System.err a excepção gerada e a pilha de execução. Programação com Objectos / Processamento de Dados I 10 5. Excepções Classes de excepções Programação com Objectos / Processamento de Dados I 11 5. Excepções Classes de excepções – Classe Throwable | Super classe de todos os erros e excepções. | Apenas objectos desta classe, ou subclasses, podem ser lançados na instrução throw e usados como argumentos da clásula catch. Constructores Programação com Objectos / Processamento de Dados I 12 5. Excepções Classes de excepções – Classe Throwable Alguns métodos: Programação com Objectos / Processamento de Dados I 13 5. Excepções Classes de excepções – Classe Error | Usada para lançar excepções por falha do JVM. | Normalmente não são tratadas pelo programador. Classes de excepções – Classe Exception | O J2SE dispõe de 55 subclasses: z z z | ClassNotFoundException IOException (contém21 subclasses) (….) Excepções do programador são subclasses de Exception. Programação com Objectos / Processamento de Dados I 14 5. Excepções Classes de excepções – Classe Exception | Construtores Programação com Objectos / Processamento de Dados I 15 5. Excepções Transferência de excepções | Frequentemente é de interesse a excepção ser tratada pelo objecto que invoca o método (normalmente a recuperação depende do objecto que o invoca). | O método, onde a excepção pode ser gerada, deve indicar no cabeçalho qual o tipo de excepção que pode ser gerada. Para tal utiliza-se: Programação com Objectos / Processamento de Dados I 16 5. Excepções Transferência de excepções | Frequentemente é de interesse a excepção ser tratada pelo objecto que invoca o método (normalmente a recuperação depende do objecto que o invoca). | O método, onde a excepção pode ser gerada, deve indicar no cabeçalho qual o tipo de excepção que pode ser gerada. Para tal utiliza-se: | Por exemplo: Programação com Objectos / Processamento de Dados I 17