Java 13 Excecoes

9,350 views

Published on

2 Comments
3 Likes
Statistics
Notes
No Downloads
Views
Total views
9,350
On SlideShare
0
From Embeds
0
Number of Embeds
49
Actions
Shares
0
Downloads
356
Comments
2
Likes
3
Embeds 0
No embeds

No notes for slide

Java 13 Excecoes

  1. 1. Exceções <ul><ul><li>Regis Pires Magalhães </li></ul></ul><ul><ul><li>[email_address] </li></ul></ul>
  2. 2. Problema 1 <ul><li>Como evitar que uma data inválida seja armazenada no atributo data? </li></ul>
  3. 3. Soluções <ul><li>Desconsiderar a operação caso uma data inválida seja identificada </li></ul><ul><ul><li>Ficamos na incerteza do sucesso ou não da operação. </li></ul></ul><ul><li>Mostrar uma mensagem de erro </li></ul><ul><ul><li>A classe fica atrelada à interface com o usuário. </li></ul></ul><ul><li>Retornar um código de erro </li></ul><ul><ul><li>Os clientes precisam fazer testes exatamente após a chamada do método. Além disso, para cada chamada, um novo teste precisa ser realizado. </li></ul></ul><ul><ul><li>Retornar um valor especial de erro quando o método já retorna algum valor significativo é deselegante e pode confundir quem está usando o método. </li></ul></ul>
  4. 4. Problema 2 // ... Conta minhaConta = new Conta(); minhaConta.deposita(100); minhaConta.setLimite(100); minhaConta.saca(1000); // o saldo é -900? É 100? É 0? // A chamada ao método saca funcionou?
  5. 5. Soluções public boolean saca( double quantidade) { if (quantidade > this .saldo + this .limite) { System.out.println( &quot;Saque fora do limite!&quot; ); return false ; } else { this .saldo = this .saldo – quantidade; return true ; } } <ul><li>Mostrar mensagem de erro </li></ul><ul><li>Retornar código de erro </li></ul>
  6. 6. Problema 2 <ul><ul><li>Como sinalizar quando o usuário passou um valor negativo? </li></ul></ul><ul><ul><li>Uma solução é alterar o retorno de boolean para int, e retornar o código do erro que ocorreu. </li></ul></ul><ul><ul><ul><li>Isto é considerado uma má prática (uso de “magic numbers”). </li></ul></ul></ul><ul><ul><li>Desvantagens: </li></ul></ul><ul><ul><ul><li>Perde-se o retorno do método; </li></ul></ul></ul><ul><ul><ul><li>O valor retornado é “mágico” (só legível perante extensa documentação) </li></ul></ul></ul><ul><ul><ul><li>Não obriga o programador a tratar esse retorno, e no caso de esquecer isso seu programa continuará rodando. </li></ul></ul></ul>
  7. 7. Exceções <ul><ul><li>Uma exceção representa uma situação que normalmente não ocorre e representa algo de estranho ou errado no sistema. </li></ul></ul><ul><ul><li>Indicam algum tipo de condição excepcional (como um erro) ocorrido ao programa. </li></ul></ul><ul><ul><ul><li>Exemplos de situações que geram exceções: </li></ul></ul></ul><ul><ul><ul><ul><li>Índice de array fora dos limites </li></ul></ul></ul></ul><ul><ul><ul><ul><li>Overflow numérico </li></ul></ul></ul></ul><ul><ul><ul><ul><li>Divisão por zero </li></ul></ul></ul></ul><ul><ul><ul><ul><li>Estouro de memória </li></ul></ul></ul></ul>
  8. 8. Por que usar exceções? <ul><ul><li>Separam a parte de lógica do sistema da parte de tratamento de erros. </li></ul></ul><ul><ul><ul><li>Evitam a criação de um código específico para cada situação em que um tipo de erro ocorre. </li></ul></ul></ul><ul><ul><ul><li>Concentram o tratamento de erros em partes específicas do código, facilitando sua legibilidade e manutenção. </li></ul></ul></ul>
  9. 9. Exceções <ul><ul><li>Uma exceção lançada interrompe o fluxo normal do programa. </li></ul></ul><ul><ul><ul><li>Se o método onde ela ocorrer não a capturar, ela será propagada para o método que chamar esse método e assim por diante. </li></ul></ul></ul><ul><ul><ul><li>Se ninguém capturar a exceção, ela irá causar o término da aplicação. </li></ul></ul></ul><ul><ul><ul><li>Se em algum lugar ela for capturada, o controle pode ser recuperado. </li></ul></ul></ul>
  10. 10. Pilha de Execução public class TesteErro { public static void main(String[] args) { System. out .println( &quot;inicio do main&quot; ); metodo1 (); System. out .println( &quot;fim do main&quot; ); } public static void metodo1() { System. out .println( &quot;inicio do metodo1&quot; ); metodo2 (); System. out .println( &quot;fim do metodo1&quot; ); } public static void metodo2() { System. out .println( &quot;inicio do metodo2&quot; ); int [] array = new int [10]; for ( int i = 0; i <= 15; i++) { array[i] = i; System. out .println(i); } System. out .println( &quot;fim do metodo2&quot; ); } }
  11. 11. Rastro da Pilha - Stacktrace Exception in thread &quot;main&quot; java.lang.ArrayIndexOutOfBoundsException : 10 at TesteErro.metodo2( TesteErro.java:18 ) at TesteErro.metodo1( TesteErro.java:10 ) at TesteErro.main( TesteErro.java:4 )
  12. 12. Soluções try { for ( int i = 0; i <= 15; i++) { array[i] = i; System.out.println(i); } } catch (ArrayIndexOutOfBoundsException e) { System.out.println( &quot;erro: &quot; + e); } for ( int i = 0; i <= 15; i++) { try { array[i] = i; System.out.println(i); } catch (ArrayIndexOutOfBoundsException e) { System.out.println( &quot;erro: &quot; + e); } }
  13. 13. Bloco try <ul><ul><li>O bloco try &quot;tenta&quot; executar um bloco de código que pode causar exceção. </li></ul></ul><ul><ul><li>Deve ser seguido por: </li></ul></ul><ul><ul><ul><li>Um ou mais blocos catch(TipoDeExcecao ref) . </li></ul></ul></ul><ul><ul><ul><li>E/ou um bloco finally . </li></ul></ul></ul><ul><ul><li>O bloco try não pode aparecer sozinho, devendo ser seguido por pelo menos um catch ou por um finally . </li></ul></ul>
  14. 14. Bloco catch <ul><ul><li>Blocos catch recebem um tipo de exceção como argumento </li></ul></ul><ul><ul><ul><li>Se ocorrer uma exceção no try , ela irá descer pelos catch até encontrar um que declare capturar exceções de uma classe ou superclasse da exceção. </li></ul></ul></ul><ul><ul><ul><li>Apenas um dos blocos catch é executado. </li></ul></ul></ul>
  15. 15. Bloco finally <ul><ul><li>O bloco finally contém instruções que devem ser executadas independentemente da ocorrência ou não de exceções. Exemplos disso são códigos de “limpeza” como fechamento de arquivos, liberação de recursos, etc. </li></ul></ul>
  16. 16. Tratamento de Exceções
  17. 17. Exceções não checadas public class Exemplo09 { public static void main(String args[]) { int i = 5571; i = i / 0; System. out .println( &quot;O resultado &quot; + i); } } Exception in thread &quot;main&quot; java.lang.ArithmeticException : / by zero at Exemplo09.main( Exemplo09.java:4 )
  18. 18. Exceções não checadas public class Exemplo09 { public static void main(String args[]) { Conta c = null ; System. out .println( &quot;Saldo: &quot; + c.getSaldo()); } } Exception in thread &quot;main&quot; java.lang.NullPointerException at Exemplo09.main( Exemplo09.java:4 )
  19. 19. Exceções não checadas public class Exemplo09 { public static void main(String args[]) { int i = Integer. parseInt ( &quot;a&quot; ); System. out .println(i); } } Exception in thread &quot;main&quot; java.lang.NumberFormatException : For input string: &quot;a&quot; at java.lang.NumberFormatException.forInputString( NumberFormatException.java:48 ) at java.lang.Integer.parseInt( Integer.java:447 ) at java.lang.Integer.parseInt( Integer.java:497 ) at Exemplo09.main( Exemplo09.java:3 )
  20. 20. Exceções não checadas <ul><ul><li>Usadas em erros que poderiam ser evitados pelo programador. </li></ul></ul><ul><ul><li>Não é obrigatório usar o try/catch nessas exceptions. </li></ul></ul><ul><ul><li>São chamadas de não checadas (unchecked), pois o compilador não checa se elas estão sendo tratadas. </li></ul></ul>
  21. 21. Exceções checadas import java.io.FileReader; public class Exemplo09 { public static void main(String args[]) { FileReader f = new FileReader( &quot;teste.txt&quot; ); } } Exception in thread &quot;main&quot; java.lang.Error: Unresolved compilation problem: Unhandled exception type FileNotFoundException at Exemplo09.main( Exemplo09.java:5 )
  22. 22. Tratamento de Exceções - catch import java.io.FileNotFoundException; import java.io.FileReader; public class Exemplo09 { public static void main(String args[]) { try { FileReader f = new FileReader( &quot;teste.txt&quot; ); } catch (FileNotFoundException e) { System. out .println( &quot;Arquivo não existe&quot; ); } } }
  23. 23. Propagação de Exceções - throws import java.io.FileNotFoundException; import java.io.FileReader; public class Exemplo09 { public static void main(String args[]) throws FileNotFoundException { FileReader f = new FileReader( &quot;teste.txt&quot; ); } }
  24. 24. Tratamento de Exceções
  25. 25. Tratamento de Exceções <ul><ul><li>E se uma letra for digitada? O que acontece? </li></ul></ul>
  26. 26. Tratamento de Exceções
  27. 27. Lançamento de Exceções public class Conta { double saldo ; // ... public boolean saca( double valor){ if ( this . saldo < valor){ return false ; } else { this . saldo -=valor; return true ; } } // ... }
  28. 28. Lançamento de Exceções public class Conta { double saldo ; // ... public void saca( double valor){ if ( this . saldo < valor){ throw new IllegalArgumentException( &quot;Saldo insuficiente&quot; ); } else { this . saldo -=valor; } } // ... }
  29. 29. IllegalArgumentException <ul><ul><li>Diz que um parâmetro enviado ao método é inválido. </li></ul></ul><ul><ul><li>É uma Exception unchecked pois estende RuntimeException. </li></ul></ul><ul><ul><li>Já faz parte do Java. </li></ul></ul><ul><ul><li>Para capturar essa exceção: </li></ul></ul>// ... Conta cc = new ContaCorrente(); cc.deposita(100); try { cc .saca(100); } catch (IllegalArgumentException e){ System.out.println(e.getMessage()); } // ...
  30. 30. Criando Exceções public class SaldoInsuficienteException extends RuntimeException { public SaldoInsuficienteException(String message) { super (message); } }
  31. 31. Usando nossas exceções public class Conta { double saldo ; // ... public void saca( double valor){ if ( this . saldo < valor){ throw new SaldoInsuficienteException( &quot;Use um valor menor&quot; ); } else { this . saldo -=valor; } } // ... } // ... Conta cc = new ContaCorrente(); cc.deposita(100); try { cc .saca(100); } catch (SaldoInsuficienteException e){ System.out.println(e.getMessage()); } // ...
  32. 32. Tratamento de Exceções <ul><ul><li>Não tratar exceções e simplesmente lançá-las em todos os métodos evita trabalho, mas torna o código menos robusto. </li></ul></ul><ul><ul><li>Mas o pior é capturar exceções e nada fazer, permitindo que erros graves passem despercebidos e causem problemas dificílimos de localizar no futuro. </li></ul></ul><ul><ul><li>NUNCA escreva o seguinte código: </li></ul></ul>
  33. 33. Lançamento de Exceções <ul><ul><li>Uma exceção precisa ser criada com new e depois lançada com throw . </li></ul></ul><ul><ul><li>Uma declaração throws (observe o &quot;s&quot;) é obrigatória em métodos e construtores que deixam de capturar uma ou mais exceções checadas que ocorrem em seu interior. </li></ul></ul><ul><ul><li>throws declara que o método pode provocar exceções do tipo declarado (ou de qualquer subtipo). </li></ul></ul><ul><ul><li>A declaração abaixo declara que o método pode provocar qualquer exceção (nunca faça isto). </li></ul></ul><ul><ul><ul><li>public void m() throws Exception {...} </li></ul></ul></ul><ul><ul><li>Métodos sobrescritos não podem provocar mais exceções que os métodos originais. </li></ul></ul>
  34. 34. Hierarquia de Exceções <ul><ul><li>Toda exceção em Java é um objeto que é uma instância de alguma subclasse da classe java.lang.Throwable . </li></ul></ul><ul><ul><li>java.lang.Throwable possui duas subclasses de exceções (erros e exceções) padronizadas: </li></ul></ul><ul><ul><ul><ul><li>java.lang.Error </li></ul></ul></ul></ul><ul><ul><ul><ul><ul><li>Normalmente indicam problemas durante o carregamento de classes, falta de memória para JVM, etc. </li></ul></ul></ul></ul></ul><ul><ul><ul><ul><ul><li>Exceções desse tipo devem ser consideradas irrecuperáveis e não devem ser tratadas . </li></ul></ul></ul></ul></ul><ul><ul><ul><ul><ul><li>Exemplos: </li></ul></ul></ul></ul></ul><ul><ul><ul><ul><ul><ul><li>java.lang.OutOfMemoryError </li></ul></ul></ul></ul></ul></ul><ul><ul><ul><ul><ul><ul><li>java.lang.InternalError </li></ul></ul></ul></ul></ul></ul><ul><ul><ul><ul><li>java.lang.Exception </li></ul></ul></ul></ul><ul><ul><ul><ul><ul><li>Normalmente indicam problemas que são passíveis de recuperação sem que o programa seja terminado. </li></ul></ul></ul></ul></ul><ul><ul><ul><ul><ul><li>Devem ser tratadas . </li></ul></ul></ul></ul></ul><ul><ul><ul><ul><ul><li>Exemplos: </li></ul></ul></ul></ul></ul><ul><ul><ul><ul><ul><ul><li>java.io.EOFException </li></ul></ul></ul></ul></ul></ul><ul><ul><ul><ul><ul><ul><li>java.lang.ArrayAccessOutOfBounds </li></ul></ul></ul></ul></ul></ul>
  35. 35. Hierarquia de Exceções
  36. 36. Hierarquia de Exceções <ul><li>Construtores de Throwable </li></ul><ul><ul><li>Throwable() </li></ul></ul><ul><ul><li>Throwable(String message) </li></ul></ul><ul><ul><li>Throwable(String message, Throwable cause) </li></ul></ul><ul><ul><li>Throwable(Throwable cause) </li></ul></ul><ul><li>Alguns métodos de Throwable </li></ul><ul><ul><li>String getMessage() </li></ul></ul><ul><ul><ul><li>Retorna mensagem passada pelo construtor </li></ul></ul></ul><ul><ul><li>Throwable getCause() </li></ul></ul><ul><ul><ul><li>Retorna exceção que causou esta exceção [Java 1.4] </li></ul></ul></ul><ul><ul><li>String toString() </li></ul></ul><ul><ul><ul><li>Retorna nome da exceção e mensagem </li></ul></ul></ul><ul><ul><li>void printStackTrace() </li></ul></ul><ul><ul><ul><li>Imprime detalhes (stack trace) sobre exceção </li></ul></ul></ul>
  37. 37. Hierarquia de Exceções <ul><li>RuntimeException e Error </li></ul><ul><ul><li>Exceções não verificadas (unchecked) em tempo de compilação </li></ul></ul><ul><ul><li>Subclasses de Error não devem ser capturadas (são situações graves em que a recuperação é impossível ou indesejável). </li></ul></ul><ul><ul><li>Subclasses de RuntimeException representam erros de lógica de programação que devem ser corrigidos ( podem ser capturadas). </li></ul></ul><ul><li>Exception </li></ul><ul><ul><li>Exceções verificadas (checked) em tempo de compilação (exceção à regra são as subclasses de RuntimeException). </li></ul></ul><ul><ul><li>Compilador exige que sejam ou capturadas ou declaradas pelo método que potencialmente as provoca. </li></ul></ul>
  38. 38. Hierarquia de Exceções <ul><ul><li>Se, entre os blocos catch , houver exceções da mesma hierarquia de classes, as classes mais específicas (que estão mais abaixo na hierarquia) devem aparecer primeiro. </li></ul></ul><ul><ul><ul><li>Se uma classe genérica aparecer antes de uma mais específica, uma exceção do tipo da específica jamais será capturado. </li></ul></ul></ul><ul><ul><ul><ul><li>O compilador detecta a situação acima e não compila o código. </li></ul></ul></ul></ul>
  39. 39. Criando uma Exceção <ul><ul><li>A classe java.lang.Throwable é a raiz da hierarquia de classes de exceção e de erros. </li></ul></ul><ul><ul><li>java.lang.Throwable define um método denominado getMessage() que retorna uma mensagem descritiva do problema ocorrido. </li></ul></ul><ul><ul><li>Para definir um novo tipo de exceção crie uma classe que estenda a classe java.lang.Throwable ou alguma de suas subclasses. </li></ul></ul><ul><ul><ul><li>Normalmente estende-se Exception ou RuntimeException . Defina atributos e métodos específicos da exceção. </li></ul></ul></ul><ul><ul><ul><li>Para armazenar uma mensagem descritiva da exceção, defina um construtor da exceção que recebe uma String e invoca (direta ou indiretamente) o construtor correspondente da superclasse java.lang.Throwable . </li></ul></ul></ul>
  40. 40. Criando uma Exceção
  41. 41. Exceções verificadas (checked) ou não verificadas (unchecked)? <ul><ul><li>Use exceções não verificadas para erros irrecuperáveis ; e verificadas para código que pode ser devidamente tratado . </li></ul></ul><ul><ul><li>Exceções não verificadas levam a: </li></ul></ul><ul><ul><ul><li>Menos código. </li></ul></ul></ul><ul><ul><ul><li>Código mais legível – não é preciso capturar exceções que não serão tratadas. </li></ul></ul></ul><ul><ul><ul><li>Aumento de produtividade. </li></ul></ul></ul><ul><ul><li>Se algo terrível aconteceu como um método de negócio não conseguir se conectar com o banco, use não verificada. </li></ul></ul><ul><ul><ul><li>Essa é a opinião de alguns autores, que defendem que o máximo que se pode fazer nesse caso é informar o usuário, pois não há como remediar a situação. </li></ul></ul></ul><ul><ul><ul><li>A desvantagem disso é que pode-se esquecer de tratar tal problema. </li></ul></ul></ul>
  42. 42. Exceções verificadas (checked) ou não verificadas (unchecked)? <ul><ul><li>A inclusão de uma exceção verificada a uma interface pode levar a muitas alterações no código. </li></ul></ul><ul><ul><li>Exceções verificadas são bem melhores que códigos de retorno de erro. Não há perigo de esquecer de tratá-las. </li></ul></ul><ul><ul><li>Se uma exceção sempre deve é tratada é preferível que seja verificada (Ex.: timeout de um processamento). </li></ul></ul>
  43. 43. Resumo <ul><ul><li>Tratar: </li></ul></ul><ul><ul><ul><li>try { ... } </li></ul></ul></ul><ul><ul><ul><li>catch (TipoExcecao ex) { ... } </li></ul></ul></ul><ul><ul><ul><li>finally { ... } </li></ul></ul></ul><ul><ul><li>Lançar: </li></ul></ul><ul><ul><ul><li>if (condicao) </li></ul></ul></ul><ul><ul><ul><ul><li>throw new MinhaExcecao(&quot;Você só pode ser uma anta &quot; ); </li></ul></ul></ul></ul><ul><ul><li>Progagar / Deixar passar: </li></ul></ul><ul><ul><ul><li>public int buscaLojas() throws MinhaExcecao() { ... } </li></ul></ul></ul><ul><ul><li>Criar / definir: </li></ul></ul><ul><ul><ul><li>public class MinhaExcecao extends Throwable { ... } </li></ul></ul></ul>
  44. 44. Prática <ul><ul><li>Implemente as exceções abaixo. </li></ul></ul><ul><ul><li>Lance-as em PessoaArrayBD, PessoaVectorBD. </li></ul></ul><ul><ul><li>Trate-as em AppMain. </li></ul></ul>

×