Document Details

ForemostRadon

Uploaded by ForemostRadon

Tags

java exceptions programming computer science

Summary

This document discusses exception handling in Java. It covers different types of exceptions, their causes, and how to handle them using try-catch blocks. The document also delves into checked and unchecked exceptions and introduces the concept of generic classes in Java programming.

Full Transcript

Tratamento de Exceções Exceções são eventos inesperados que ocorrem durante a execução do programa. Podem ocorrer devido a falhas impossíveis de prever, como por exemplo, um recurso não estar disponível (por ex. um ficheiro), perder-se uma ligação de rede a meio de uma c...

Tratamento de Exceções Exceções são eventos inesperados que ocorrem durante a execução do programa. Podem ocorrer devido a falhas impossíveis de prever, como por exemplo, um recurso não estar disponível (por ex. um ficheiro), perder-se uma ligação de rede a meio de uma comunicação, o utilizador inserir um valor inesperado, ou simplesmente devido a um erro lógico da responsabilidade do programador. A divisão por zero ou o acesso para além dos limites de um array, são exemplos de falhas que originam o lançamento de exceções e, como derivam de imperfeições do código, serão da responsabilidade do programador. Podemos admitir que as exceções têm então 3 tipos de causas: dados de entrada inválidos (da responsabilidade do utilizador); erros de programação (da responsabilidade do programador); falhas de recursos externos (causas externas). Em java, uma exceção é um objeto (instância de uma subclasse de Exception) que é lançado (thrown) por um código que deteta a situação inesperada. A exceção pode depois ser capturada (caught) por um bloco de código específico que trate o problema. Se não capturada, a exceção provoca a interrupção imediata da execução do programa e envia uma mensagem de erro para a consola. Existem ainda outros erros mais graves (falhas críticas), por norma não capturáveis e lançados pela JVM, que são representados por objetos de uma das subclasses de Error. POO com Java 15 Algoritmos e Estrutura de Dados Throwable Hierarquia de classes de alguns Error dos erros e exceções definidos AssertionError no package java.lang VirtualMachineError OutOfMemoryError StackOverflowError Exception CloneNotSupportedException InterruptedException ReflectiveOperationException ClassNotFoundException RuntimeException (unchecked) ArithmeticException (por exemplo, divisão por zero) ClassCastException IllegalStateException (invocação de um método com estado do objeto inadequado) IllegalArgumentException NumberFormatException IndexOutOfBoundsException ArrayIndexOutOfBoundsException (acesso a um array com índice fora dos limites) StringIndexOutOfBoundsException NullPointerException (utilização de null sendo esperado um objeto válido) POO com Java 16 Algoritmos e Estrutura de Dados Checked and Unchecked Exceptions Existem duas categorias de exceções: as ‘checked’ e as ‘unchecked’. Checked exceptions são verificadas pelo compilador; também designadas compile time exceptions; Object não podem ser ignoradas; o programador deve-lhes dar o devido tratamento; Throwable Unchecked exceptions não são verificadas pelo compilador; também designadas runtime exceptions; Exception Error correspondem a bugs de programação que deverão ser resolvidos até à versão final do SW; Outras Exceções RuntimeException não há a obrigatoriedade de as tratar. POO com Java 17 Algoritmos e Estrutura de Dados Métodos que dão origem a checked exceptions Quando o código de um método pode dar origem a uma checked exception, há duas abordagens possíveis a seguir na implementação desse método: tratámos a exceção – colocamos a parte “perigosa” do código (a que pode originar a exceção) dentro de um bloco de código especial, designado try- catch, que terá como missão dar o devido tratamento à exceção que venha a ocorrer; propagamo-la – alternativamente, deixamos para outros (aqueles que venham a invocar o método) o tratamento da possível exceção; mas para isso é necessário declarar o método como ‘lançador da exceção’, através da inclusão da cláusula throws no seu cabeçalho. Um outro método que venha depois a invocar o método ‘lançador da exceção’, terá também ele as mesmas duas opções: trata a possível exceção, invocando o método “perigoso” a partir de dentro de um bloco try-catch; ou então propaga-a para outros, declarando-se também ele “lançador da exceção”, através da cláusula throws. E assim sucessivamente… POO com Java 18 Algoritmos e Estrutura de Dados Captura de exceções (Catching exceptions) O tratamento de exceções é assegurado pela construção try- catch, dentro da qual se executa o segmento de código que se pretende “vigiar” (tratar as exceções que por ele venham a ser lançadas). Se esse segmento de código lançar uma exceção, então ela será capturada por um dos blocos catch, que tentará dar-lhe o tratamento adequado. O bloco catch selecionado será o primeiro que aceite como parâmetro uma exceção de um tipo compatível com a que foi lançada; Caso a exceção lançada não seja compatível com nenhum dos parâmetros dos blocos catch, a mesma não será capturada (e a execução da aplicação termina abruptamente); Não ocorrendo qualquer exceção no código “vigiado”, todos os blocos catch são ignorados. Opcionalmente, a construção try-catch pode acabar num bloco finally, o qual será sempre executado, aconteça o que acontecer: não surgimento de exceção, exceção lançada mas não capturada, exceção capturada. POO com Java 19 Algoritmos e Estrutura de Dados Lançamento de exceções (Throwing exceptions) Quando uma parte do código encontra então algum tipo de problema durante a execução, tem a possibilidade de lançar uma exceção, isso é feito usando o comando throw, seguido do objeto do tipo exceção que se pretenda lançar. O mais normal é criar-se o objeto no exato momento do seu lançamento throw new exceptionType(parameters); Como dissemos já, quando há a possibilidade de um determinado método gerar uma checked exception, e não pretenda ele próprio tratá- la, então ela deverá ser propagada e esse facto ser explicitamente declarado, incluindo na assinatura do método a cláusula throws. Não confundir com o comando throw; Caso a exceção seja unchecked, ainda que não sejamos obrigados, podemos ainda assim adotar o mesmo procedimento. Por exemplo, o método parseInt da classe Integer tem a seguinte assinatura: public static int parseInt(String s) throws NumberFormatException; POO com Java 20 Algoritmos e Estrutura de Dados Classes Genéricas (generics) Em java é possível definir classes e métodos genéricos, de forma a poderem operar sobre diferentes tipos de dados Correspondem às templates do C++ Este mecanismo permite-nos definir uma classe parametrizável, em que os parâmetros significam tipos de dados ( “parâmetros tipo” ), que podem ser usados como tipos para a declaração das variáveis e atributos, e para os tipos de valor de retorno dos métodos; Esses parâmetros tipo só mais tarde são concretizados, aquando do uso da respetiva classe como um tipo de dados numa qualquer parte do programa. Uma classe genérica, no fundo, permite atrasar a especificação do tipo de dados de um (ou mais) qualquer elemento tratado por si, até ao momento em que vier a ser usada; Por outras palavras, é uma classe que usa um ou mais tipos de dados deixados em aberto… Envolvem algumas restrições que têm de ser respeitadas e que não existiam em C++: os parâmetros dos genéricos não podem ser tipos primitivos, apenas classes (por isso é que existem classes que “embrulham” os tipos primitivos); Sendo T um parâmetro de um genérico, não se pode fazer new T; POO com Java 21 Algoritmos e Estrutura de Dados Exemplo de classe genérica Os parâmetros podem ser declarados usando nomes genéricos (A, B) parâmetros formais Os parâmetros são depois instanciados usando tipos concretos Pair par = new Pair (“Ana”, 2.5); double d = par.getSecond(); parâmetros atuais auto-boxing auto-unboxing POO com Java 22 Algoritmos e Estrutura de Dados

Use Quizgecko on...
Browser
Browser