Capítulo 6 Exceções
Exceções Exceptions try / catch Hierarquia de Exceptions Exceções verificadas Transferindo exceções Cláusula throws Cláusula finally Principais métodos de exceções Principais exceções Cláusula throw Exceções personalizadas
Exceptions Mecanismo utilizado pelo Java para informar que algo inesperado aconteceu Quando sua aplicação não contorna situações de exceptions, ocorre a interrupção abrupta
try / catch try { // Instruções sujeitas // a falhas } catch (Exception e) { // Instruções a serem executadas // em caso de falha }
try / catch – Exemplo try { Conexao cn = abrirConexao(); cn.gravarRegistro(aluno1); } catch (Exception e) { System.out.println(“Erro ao gravar”); System.out.println(e.getMessage()); }
Hierarquia de Exceptions try { Conexao cn = abrirConexao(); Aluno aluno1 = cn.obterDados(); cn.gravarNoArquivo(aluno1); } catch (SQLException sqle) { System.out.println(“Erro ao acessar banco de dados”); } catch (IOException ioe) { System.out.println(“Erro ao gravar no arquivo”); } catch (Exception e) { System.out.println(“Erro inesperado”); }
Hierarquia de Exceptions Throwable Exception Error SQLException ParseException IOException RuntimeException ArithmeticException NullPointerException ArrayIndexOutOfBoundsException NumberFormatException
Exceções verificadas FileReader texto; ... texto = new FileReader(“C:\\arquivos\\carta.txt”); A instrução acima oferece risco de utilização (FileNotFoundException) e deve possuir tratamento de erro. Não é permitido sem Tratamento de erro
Exceções verificadas FileReader texto; ... try { texto = new FileReader(“C:\\arquivos\\carta.txt”); } catch (FileNotFoundException e) { System.out.println(“Arquivo não encontrado”); }
Exceções verificadas Throwable Exception Error SQLException ParseException IOException RuntimeException ArithmeticException NullPointerException ArrayIndexOutOfBoundsException NumberFormatException
Transferindo exceções Ao utilizar instruções que exigem o tratamento de exceptions, temos duas opções: Tratar a exception com try / catch, conforme já visto Transferir a exception para quem chamou o método atual através da cláusula throws
Transferindo exceções Cláusula throws void abrirArquivo() throws FileNotFountException { FileReader texto; ... texto = new FileReader(“C:\\arquivos\\carta.txt”); }
Cláusula finally Bloco de código associado ao try/catch que garante a execução de instruções mesmo quando não ocorre exceções Define um bloco de código que será executado 100% das vezes Geralmente utilizado para finalizar alguma pendência que o método deixou
Cláusula finally public double obterSaldo() throws IOException { Conexao cn = null; try { cn = abrirConexao(); Conta c1 = cn.obterConta(); double saldo = c1.getSaldo(); cn.gravarNoArquivo(saldo); return saldo; } catch (SQLException sqle) { System.out.println("Erro ao acessar BD"); } catch (RuntimeException e) { System.out.println("Erro inesperado"); } finally { fecharConexao(cn); }
Principais métodos de exceções getMessage() Retorna uma mensagem a respeito do problema que provocou a exception. try { ... } catch (Exception e) { System.out.println(“Ocorreu um problema: ” + e.getMessage()); }
Principais métodos de exceções printStackTrace() Exibe em console a pilha de chamadas de métodos desde o método main até o momento em que a exception ocorreu. try { ... } catch (Exception e) { e.printStackTrace(); }
Principais exceções java.lang.NullPointerException java.lang.NumberFormatException java.lang.ArrayIndexOutOfBoundsException java.lang.ArithmeticException java.lang.ClassCastException java.io.IOException java.sql.SQLException
Principais exceções NullPointerException Exceção não verificada pertencente ao pacote java.lang Ocorre ao tentar executar um método sobre uma variável que não possui um objeto referenciado Cliente c = null; c.setNome(“Manuel da silva”);
Principais exceções NumberFormatException Exceção não verificada pertencente ao pacote java.lang Ocorre ao tentar realizar a conversão de um String para um valor numérico String texto = “10xpt23”; int idade = Integer.parseInt(texto);
Principais exceções ArrayIndexOutOfBoundsException Exceção não verificada pertencente ao pacote java.lang Ocorre ao tentar obter um item inexistente em um array double[] salario = { 1200.5, 630.0, 950.15 }; double s = salario[3];
Principais exceções ArithmeticException Exceção não verificada pertencente ao pacote java.lang Ocorre em operações aritméticas com inteiros que possuem resultado inválido int valorTotal = 25; int quantidadePessoas = 0; int rateio = valorTotal / quantidadePessoas;
Principais exceções ClassCastException Exceção não verificada pertencente ao pacote java.lang Ocorre ao tentar realizar o cast (tipagem) para um tipo incompatível com o objeto Conta c = new ContaPoupanca(); ContaCorrente cc = (ContaCorrente) c;
Principais exceções IOException FileReader doc; Exceção verificada pertencente ao pacote java.io (será visto no capítulo 10) Ocorre em operações de input/output, como leitura de arquivos, comunicação por rede que não são realizados com sucesso. Possui diversas classes filhas que representam subtipos de problemas do gênero I/O FileReader doc; doc = new FileReader(“C:\\carta.txt”);
rs = st.executeUpdate(“SELECT nome, salario FROM tab_funcionario”); Principais exceções SQLException Exceção verificada pertencente ao pacote java.sql (será visto no capítulo 11) Ocorre ao tentar realizar operações de acesso a bancos de dados que resultam em problemas, tais como: Tentar acessar um banco de dados que não está no ar; Tentar conectar com usuário ou senha inválidos; Tentar acessar uma tabela inexistente. rs = st.executeUpdate(“SELECT nome, salario FROM tab_funcionario”);
Cláusula throw Força a ocorrência de uma exception sinalizando que há algum problema ao executar a operação em questão.
Cláusula throw Exemplo public void exibeParabens(int idade) throws Exception { if (idade >= 0) { System.out.println(“Parabens pelos seus ” + idade + “ anos de vida.”); } else { throw new Exception(“Idade inválida”); }
Cláusula throw Na aplicação principal... public void rotinaPrincial() { Conexao cn = null; try { cn = abrirConexao(); Cliente cli = cn.obterCliente(); int idade = cli.getIdade(); exibeParabens(idade); } catch (SQLException sqle) { System.out.println(“Erro ao acessar BD”); } catch (Exception e) { System.out.println(“Ocorreu um erro: ” + e.getMessage()); } finally { fecharConexao(cn); }
Exceções personalizadas Na maioria das ocasiões, ao implementar métodos que geram exceptions, é recomendável criar a sua própria exceção. Isto permite que a aplicação principal utilize blocos catch específicos para a exception em questão
Exceções personalizadas Exemplo public void debitar(double valor) throws SaldoInsuficienteException { if (valor <= this.saldo) { this.saldo -= valor; } else { throw new SaldoInsuficienteException( “Valor muito alto para debitar: ” + valor); } Esta classe precisa ser criada
Exceções personalizadas Criando a classe exceção public class SaldoInsuficienteException extends Exception { public SaldoInsuficienteException() { super(); } public SaldoInsuficienteException(String message) { super(message);
Exceções personalizadas Na aplicação principal... public void obterSaldo() { Conexao cn = null; try { cn = abrirConexao(); Conta conta = cn.obterConta(); conta.debitar(valorBoleto); } catch (SQLException sqle) { System.out.println(“Erro ao acessar BD”); } catch (SaldoInsuficienteException e) { System.out.println(“Ocorreu um erro: ” + e.getMessage()); } catch (Exception e) { System.out.println(“Ocorreu um erro desconhecido.”); } finally { fecharConexao(cn); }
Exercício 1 Crie uma classe executável ExercicioIdade que realize as seguintes operações: Através da classe Scanner, método nextLine() Solicite ao usuário que digite o ano de seu nascimento; Calcule e exiba sua idade assumindo que estamos no ano 2012; Caso ocorra algum problema na conversão do valor digitado pelo usuário, exiba a mensagem “Valor digitado inválido”. Utilize para isto o tratamento sobre a exception NumberFormatException.
Exercício 2 As linhas de código abaixo são utilizadas para gravar um texto dentro de um novo arquivo no sistema operacional: PrintWriter writer = new PrintWriter(“C:\\doc1.txt”); writer.println(texto); writer.close(); onde texto é uma variável String qualquer contendo algum texto.
Exercício 2 (Fim) Crie uma classe executável ExercicioGravacao que solicite que o usuário digite uma frase e grave-a em um arquivo conforme mostrado no slide anterior. Caso ocorra algum problema durante a gravação, exiba a mensagem “Falha ao gravar as informações digitadas”.