Your SlideShare is downloading. ×
0
Java 13 Excecoes
Java 13 Excecoes
Java 13 Excecoes
Java 13 Excecoes
Java 13 Excecoes
Java 13 Excecoes
Java 13 Excecoes
Java 13 Excecoes
Java 13 Excecoes
Java 13 Excecoes
Java 13 Excecoes
Java 13 Excecoes
Java 13 Excecoes
Java 13 Excecoes
Java 13 Excecoes
Java 13 Excecoes
Java 13 Excecoes
Java 13 Excecoes
Java 13 Excecoes
Java 13 Excecoes
Java 13 Excecoes
Java 13 Excecoes
Java 13 Excecoes
Java 13 Excecoes
Java 13 Excecoes
Java 13 Excecoes
Java 13 Excecoes
Java 13 Excecoes
Java 13 Excecoes
Java 13 Excecoes
Java 13 Excecoes
Java 13 Excecoes
Java 13 Excecoes
Java 13 Excecoes
Java 13 Excecoes
Java 13 Excecoes
Java 13 Excecoes
Java 13 Excecoes
Java 13 Excecoes
Java 13 Excecoes
Java 13 Excecoes
Java 13 Excecoes
Java 13 Excecoes
Java 13 Excecoes
Upcoming SlideShare
Loading in...5
×

Thanks for flagging this SlideShare!

Oops! An error has occurred.

×
Saving this for later? Get the SlideShare app to save on your phone or tablet. Read anywhere, anytime – even offline.
Text the download link to your phone
Standard text messaging rates apply

Java 13 Excecoes

8,619

Published on

2 Comments
2 Likes
Statistics
Notes
No Downloads
Views
Total Views
8,619
On Slideshare
0
From Embeds
0
Number of Embeds
0
Actions
Shares
0
Downloads
339
Comments
2
Likes
2
Embeds 0
No embeds

Report content
Flagged as inappropriate Flag as inappropriate
Flag as inappropriate

Select your reason for flagging this presentation as inappropriate.

Cancel
No notes for slide

Transcript

  1. Exceções <ul><ul><li>Regis Pires Magalhães </li></ul></ul><ul><ul><li>[email_address] </li></ul></ul>
  2. Problema 1 <ul><li>Como evitar que uma data inválida seja armazenada no atributo data? </li></ul>
  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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. Tratamento de Exceções
  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. 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. 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. 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. 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. 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. 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. Tratamento de Exceções
  25. Tratamento de Exceções <ul><ul><li>E se uma letra for digitada? O que acontece? </li></ul></ul>
  26. Tratamento de Exceções
  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. 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. 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. Criando Exceções public class SaldoInsuficienteException extends RuntimeException { public SaldoInsuficienteException(String message) { super (message); } }
  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. 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. 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. 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. Hierarquia de Exceções
  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. 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. 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. 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. Criando uma Exceção
  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. 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. 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. 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>

×