Baixe o app para aproveitar ainda mais
Prévia do material em texto
POOS3 – Programação Orientada a Objetos edilson.ifsp@gmail.com Aula 5 – Exceções checadas e não checadas 1. Introdução As exceções podem ser classificadas em checadas (verificadas) ou não checadas (não verificadas). As exceções não checadas são exceções do tipo RuntimeException. Essas exceções ocorrem devido a deficiências do código escrito pelo programador, ou seja, são exceções que poderiam ser evitadas pelo código escrito pelo programador. Como exemplo, pode-se citar ArithmeticException, ArrayIndexOutOfBoundsException, NullPointerException, etc. Já as exceções checadas são do tipo Exception (mas não derivam de RuntimeException). Elas ocorrem por fatores que não estão sob o controle do programa (do código escrito pelo programador). Como exemplo, podemos citar exceções relacionadas com a leitura de arquivos, acesso a um banco de dados, etc. O detalhe é que o compilador é capaz de identificar se exceções checadas podem ser lançadas em um determinado trecho de código e exigirá que elas sejam tratadas ou declaradas, na assinatura do método, por meio da clausula throws. Para tratar as exceções checadas é preciso utilizar o bloco try/catch para manipular as exceções. Para declarar que o método em questão pode lançar uma determinada exceção, a palavra chave throws deve ser utilizada. Nesse ponto é importante destacar que qualquer outro método que precise utilizar esse método (cuja exceção foi declarada) deverá tratar essa exceção ou declará-la novamente. Veja o exemplo: public void gravar(ArrayList<Aluno> alunos) throws IOException{ File arquivo = new File("dados_alunos.txt"); PrintWriter pw = new PrintWriter(arquivo); … Observe que o método “gravar” utiliza a palavra chave throws para declarar que a exceção IOException pode ser lançada. Isso de deve ao fato de utilizarmos a linha de código “PrintWriter(arquivo)”. A não utilização da declaração throws implicaria na inclusão do bloco try/catch. Entretanto, observe que o método “gravarDadosArquivo()” precisa utilizar o bloco try/catch, pois faz uso do método “gravar(ArrayList<Aluno> alunos)”, que pode lançar exceções do tipo IOException. private void gravarDadosArquivo(){ try{ if (!alunos.isEmpty()){ dao.gravar(alunos); taAlunos.append("Dados Gravados!"); } else { JOptionPane.showMessageDialog(this, "Não há informações cadastradas! \n"); } } catch(IOException ioe){ JOptionPane.showMessageDialog(this, "Erro ao gravar o arquivo! \n" + ioe.getMessage()); } } 2. Exercícios 2.1. Escreva um programa que ilustre o relançamento de uma exceção. Defina os métodos metodo1() e metodo2(). O método metodo2() deve lançar inicialmente uma exceção. O método metodo1() deve chamar o metodo2(), capturar a exceção e relançá-la. Chame o metodo1() a partir do main() e capture a exceção relançada. Imprima o rastreamento de pilha dessa exceção. 2.2. Escreva um programa que simule a utilização de três métodos: (i) o primeiro deve possibilitar a conexão com um computador remoto. (ii) o segundo deve possibilitar a conexão com um banco de dados (que está instalado no computador remoto). (iii) o terceiro deve permitir que um valor seja armazenado no banco de dados. Os métodos listados acima devem fazer parte de uma classe e você precisa gerenciar a conexão com o computador remoto, a conexão com o banco e também se a operação de gravação no banco de dados foi realizada com sucesso ou não. Esse processo pode ser controlado manualmente (por meio de eventos de clique em botões) ou automaticamente (no qual o sucesso ou não de uma operação é realizado de maneira aleatória, através de sorteio). Vale ressaltar que a tentativa de gravação (item iii) depende que as conexões i) e ii) tenham sido estabelecidas com sucesso. As seguintes exceções podem ser lançadas em cada um dos métodos: (i) java.net.SocketException (ii) java.sql.SQLException (iii) java.lang.ClassCastException 2.3. O trecho de código abaixo funciona ou gera um erro de compilação? Explique. public void metodo1(){ try{ } finally{ } } 2.4. Qual a saída do código abaixo? public class Ex1 { public static void lancar () { System.out.print("throw "); throw new RuntimeException(); } public static void main(String [] args) { try { System.out.print("olá "); lancar(); } catch (Exception e) { System.out.print("catch "); } finally { System.out.print("finally "); } System.out.println("depois "); } } a) olá throw catch b) o programa não compila c) olá throw RuntimeException catch depois d) olá throw RuntimeException e) olá throw catch finally depois f) olá throw catch finally depois RuntimeException 2.5. Qual a saída do código abaixo? public class Ex2 { public static void throwit() { throw new RuntimeException(); } public static void main(String args[]){ try { System.out.println("Olá "); throwit(); System.out.println("Bloco try "); } finally { System.out.println("Executando finally "); } } } a) O programa não compila. b) O programa executa e nenhuma exceção é lançada. c) O programa imprime “Olá”, depois imprime que uma exceção ocorreu em tempo de execução, então imprime “Bloco try” e por fim imprime “Executando finally”. d) O programa imprime “Olá”, depois imprime que uma exceção ocorreu em tempo de execução e por fim imprime “Executando finally”. e) O programa imprime “Olá”, então imprime “Executando finally” e por fim imprime que uma exceção ocorreu em tempo de execução.
Compartilhar