Capítulo 5. Tratamento de excepções 1/20
Índice Indice 5.1 - Excepção 5.2 - Try-Catch-Finally 5.3 - Escalar excepção não tratada 5.4 - Como lançar excepções 2/20
Índice 5.1 Excepção 5.1 - Excepção 5.2 -- Try--Catch Catch--Finally 5.3 -- Escalar excepção não tratada 5.4 -- Como lançar ar excepções 3/20
5.1 Excepção Excepção É um evento que ocorre ao ser identificada uma condição que impede a execução normal do programa A execução de um programa pode parar inesperadamente devido a um erro de runtime Erro de runtime pode ter várias causas: -Erro de lógica: Divisão por zero, acesso fora dos limites de um array, leitura de número com formato inválido -Erro físico: Ficheiro removido, ficheiro sem permissões, erro de comunicações, Uma excepção é um objecto da classe Exception criado pelo JRE como resposta a um erro de runtime: 4/20
5.1 Excepção Excepção O programa abaixo não tem erros de sintaxe. Provoca uma divisão por zero em temo de execução Esta instrução provoca a divisão por zero Excepção é uma instanciação de um objecto que pertence à classe Exception e é instanciado quando ocorre um erro de runtime Exception in thread "main" java.lang.arithmeticexception: / by zero Java Result: 1 at Capitulo5.TryCatch01Ficha6.main(TryCatch01Ficha6.java:14) 5/20
Índice 5.2 Try Catch Finally 5.1 -- Excepção 5.2 - Try-Catch-Finally 5.3 -- Escalar excepção não tratada 5.4 -- Como lançar ar excepções 6/20
5.2 Try-Catch-Finaly Os blocos Try Catch...Finally Permitem tratar os erros em tempo de execução e o retomar do controlo do programa pelo programador -A instrução suspeita fica num bloco try.o corpo try é executado até que uma excepção seja lançada. Caso nenhuma excepção seja lançada, o try termina normalmente. -Definir um bloco catch para cada excepção que pode aparecer -Cada bloco catch vai tratar do respectivo erro de runtime -No bloco Finally colocamos o código que queremos que seja sempre executado quer haja ou não excepção e, identifica o objecto instanciado (Exception) Provoca divisão por zero Trata divisão por zero Se a excepção não fosse tratada, esta instrução não seria executada 7/20
5.2 Try-Catch-Finaly Os blocos Try...Catch...Finally A classe Exception é derivada da classe Trowable -A classe exception possui subclasses cujas propriedades se adaptam ao erro específico. -Isto permite ter 1 bloco try com vários blocos catch onde cada um trata um erro específico Trata qualquer erro (intanciada num catch) Tratam erros mais específicos (intanciadas em blocos catch) -Os blocos catch são percorridos sequencialmente até encontrar o erro. Se nenhum se ajustar ao erro mais específico ocorrido o programa pára com erro de execução. -Por esse motivo no último catch deve ser colocado um objecto da classe Exception 8/20
5.2 Try-Catch-Finaly Os blocos Try...Catch...Finally Exemplo 1 Formato de número inválido Dos vários blocos, este trata a excepção Instruções que são sempre executadas quer haja ou não excepções Resultado: NumberformatExcepion Bloco Finally Fim do programa 9/20
5.2 Try-Catch-Finaly Os blocos Try...Catch...Finally Exemplo 2 Acesso a posição fora dos limites do array O erro não encaixa em nenhuma das escepções. É tratado pelo objecto Exception Resultado: Bloco Excepion Bloco Finally Fim do programa O erro acima encaixa na classe: ArrayIndexOutOfBoundsException Exemplos de outras excepções pré definidas: IndexOutOfBoundsException NegativeArraySizeException IOException SQLException etc... 10/20
Índice 5.3 Escalar excepção não tratada 5.1 -- Excepção 5.2 -- Try--Catch Catch--Finally 5.3 - Escalar excepção não tratada 5.4 -- Como lançar ar excepções 11/20
5.3 Escalar excepção não tratada Escalar excepções não tratadas Em Java as excepções não tratadas são escaladas para o nível acima -Escalar significa passar o problema para o chefe. -O nível acima (chefe) é o bloco de código chamador A excepção escala até ao bloco main(). Se aí não for tratada a execução do programa pára. -Neste caso o JRE devolve um código de erro ao sistema operativo Quando ocorre uma excepção: -A primeira verificação é tratada pelo método onde o bloco está incluido -Se não houver tratamento, a excepção é enviada para o método que a chamou e assim sucessivamente. -Se nunca for tratada, ao chegar a main() o programa é interrompido e o utilizador informado com uma mensagem de erro. 12/20
5.3 Escalar excepção não tratada Exemplo Excepção não é tratada e portanto é escalada para o método main(). (Chamador) O bloco chamador faz o tratamento da excepção Imprime o conteúdo da pilha de execução dandonos informação sobre a sequência de invocação de métodos Resultado: Programa não pára pois a excepção é tratada java.lang.arithmeticexception: / by zero at Capitulo5.ExcepcaoEscalada.metodoComErro(ExcepcaoEscalada.java:4) at Capitulo5.ExcepcaoEscalada.main(ExcepcaoEscalada.java:8) Fim de programa Linha 4 do métodocomerro Linha 8 demain 13/20
5.3 Escalar excepção não tratada Escalamento de excepções com a directiva Throws Existem dois tipos de métodos no que diz respeito a tratamento de excepções: -Os métodos com baixa probabilidade de gerar excepções (como os estudados anteriormente). Neste caso o tratamento da excepção é opcional. (unchecked exception) -Os métodos com alta probabilidade de gerar excepções (como por exemplo os que operam sobre dispositivos de entrada / saída IO). Neste caso o tratamento da excepção é obrigatório. (checked exception) O tratamento de excepções pode ser feito por : -Try-Catch (como visto até agora) Escalamento com Throws -Directiva throws -> Neste caso não se trata a excepção. Esta directiva limita-se a escalá-la Utilizando throws tranquilizamos o compilador dizendo que vamos tratar a excepção escalando-a, mas na realidade não a estamos a tratar 14/20
5.3 Escalar excepção não tratada Escalamento de excepções com a directiva Throws Exemplo Obrigatório devido ao método read(). Faz o tratamento da excepção escalando-a. Informa o compilador que esta vai ser tratada. Método read() pode lançar uma IOException que é uma checked exception Alternativa Em vez de escalar, tratar a excepção obrigatória no bloco try...catch 15/20
Índice 5.4 Como lançar excepções 5.1 -- Excepção 5.2 -- Try--Catch Catch--Finally 5.3 -- Escalar excepção não tratada 5.4 - Como lançar excepções 16/20
5.4 Como lançar excepções Lançamento de excepção pré-definida: Instrução throw A instrução throw permite ao programador simular a ocorrência de um erro de runtime O programador pode provocar erros de runtime em qualquer altura do programa. Atenção: Não confundir throw com throws -throw cria uma excepção enquanto throws trata uma excepção A divisão de a/b Lança sempre uma excepção A excepção é tratada num bloco catch e o programa prossegue até ao fim Resultado: 1 java.lang.arithmeticexception: Fui eu que lancei at Capitulo5.Throw01.main(Throw01.java:12) Fim de programa 17/20
5.4 Como lançar excepções Criação de excepções O programador pode criar as suas próprias excepções (a partir da classe Exception) -Exemplo1 : Cria MinhaExcepcao -O lançamento destas excepções pode ser forçado recorrendo a throw e depois serão tratadas recorrendo a try...catch ou throws. Lança MinhaExcepcao Trata MinhaExcepcao Resultado: Criado objecto de minha excepção! Responsável: Data: Executa catch Versão com MinhaExcepcao Pág.: Fim de programa 18/20
5.4 Como lançar excepções Criação de excepções Exemplo2 -Lançamento de MinhaExcepção, mas em vez de a tratar escala o problema com throws escala MinhaExcepcao Lança MinhaExcepcao Programa termina já que a excepção nunca chega a ser tratada. Resultado: Criado objecto de minha excepção! Exception in thread "main" Capitulo5.MinhaExcepcao: Criar objecto de MinhaExcepcao at Capitulo5.MinhaExcepcaoThrows.main(MinhaExcepcaoThrows.java:6) Java Result: 1 19/20
FIM 20/20