JAVA Tópicos Especiais de Programação Orientada a Objetos 1
TRY CATCH 2
O que fazer quando algo inesperado acontece? 3
O que fazer quando algo inesperado acontece? Com JAVA podemos nos prevenir!!! 3
O que acontecerá quando um método que você quiser chamar (provavelmente de uma classe que não criou) for perigoso? 1 Suponhamos que você quisesse chamar um método de uma classe que não criou. escreve que usa métodos da você seu código classe que você não criou 4
O que acontecerá quando um método que você quiser chamar (provavelmente de uma classe que não criou) for perigoso? 2 Esse método faz algo arriscado, algo que pode não funcionar no tempo de execução. a classe que você não criou void moo() { if (serverdown) { explode(); 5
O que acontecerá quando um método que você quiser chamar (provavelmente de uma classe que não criou) for perigoso? 3 Você precisa saber se o método que está chamando é perigoso. Será que esse método pode travar? Meu método moo() será interrompido se o servidor travar. você 6 classe que você não criou
O que acontecerá quando um método que você quiser chamar (provavelmente de uma classe que não criou) for perigoso? 4 Em seguida, você escreverá um código que consiga manipular a falha, se ela realmente ocorrer. É preciso estar preparado, para o caso de acontecer. Agora que eu sei, posso tomar precauções. escreve com segurança você 7 seu código
Moral da história: Previna-se 8
Em Java os métodos usam exceções para informar Aconteceu algo errado. Falhei ao código que os chamou. O mecanismo de manipulação de exceções do Java é uma maneira simples e clara de lidar com as exceções que podem surgir no tempo de execução. Ele se baseia no fato de você saber que o método que está sendo chamado é perigoso, o que te permite criar um código que trate essa possibilidade. Mas como saber se um método lança uma exceção? 9
Em Java os métodos usam exceções para informar Aconteceu algo errado. Falhei ao código que os chamou. O mecanismo de manipulação de exceções do Java é uma maneira simples e clara de lidar com as exceções que podem surgir no tempo de execução. Ele se baseia no fato de você saber que o método que está sendo chamado é perigoso, o que te permite criar um código que trate essa possibilidade. Mas como saber se um método lança uma exceção? Através da cláusula throws na declaração do método. 9
10
Através de um bloco Try Catch é possível informar ao compilador que você estará tratando esta exceção. O compilador não se importará com a maneira como você manipulará; o importante é que você informe que está cuidando do problema. Sintaxe: try { //código a ser executado catch (Exceção) { //código de tratamento de erro finally { //código sempre executado 11
public class TratativaDeErros { TRATAMENTO DE ERROS public static void main(string[] args) { int[] array = {0, 1, 2, 3, 4, 5; for (int i=0; i<10; i++) { array[i] += i; System.out.println("array[" + i + "] = " + array[i]); System.out.println("Laço executado com sucesso."); 12
public class TratativaDeErros { public static void main(string[] args) { int[] array = {0, 1, 2, 3, 4, 5; try { for (int i=0; i<10; i++) { array[i] += i; System.out.println("array[" + i + "] = " + array[i]); System.out.println("Laço executado com sucesso."); catch (ArrayIndexOutOfBoundsException e) { System.out.println("Acessou um índice inexistente."); catch (Exception e) { System.out.println("Outro tipo de exceção."); finally { System.out.println("Isto SEMPRE executa."); 13
14
14
O que é uma exceção?!?!?! Uma exceção é um objeto... De tipo Exception. Throwable getmessage() printstracktrace() Exception Parte da hierarquia da classe Exception. Todas as classes estendem a classe Throwable e herdam dois métodos-chaves. IOException InterruptedException 15
Existem 3 diferentes tipos de erros: TRATAMENTO DE ERROS Erro de Runtime (java.lang.runtime) Erro de Sistema (java.lang.error) Erro Customizado (java.lang.exception) Os erros de Runtime são causados por bugs do programa, que desconhecemos, ou seja, uma condição especial que sequer havíamos imaginado. Os erros de Runtime são subclasses da classe Runtime, que é subclasse de Exception. Os erros de sistema são erros imprevisíveis, causados por falha do sistema, como acesso a disco, erro do banco de dados e etc. Estes erros são subclasses da classe Error. E os erros Customizados são erros ou condições especiais previstas no programa. Esses erros são subclasse da classe Exception. 16
Mas realmente como funciona o lançamento de uma exceção? 1 Código perigoso que lança uma exceção: Informa para todos o tipo de exceção que pode ser lançada. public void takerisk() throws BadException { if (abandonallhope) { throw new BadException(); Cria um novo objeto Exception e o lança. 17
2 Seu código que chama o método perigoso: public void crossfingers() { try { anobject.takerisk(); catch (BadException ex) { System.out.println( Ai não!!! ); ex.printstacktrace(); Se você não conseguir se recuperar da exceção, pelo menos execute um restreamento de pilha, usando o método printstacktrace() que todas as exceções herdam. 18
Um método pode lançar mais de um tipo de exceção, mas a delcaração de um método deve incluir todas as exceções verificadas que ele pode lançar. Porém se duas ou mais exceções tiverem a mesma superclasse, o método poderá declarar apenas a superclasse. public class Lavanderia { public void lavarroupas() throws CalcaException, LingerieException { //código public class Foo { public void go() { Lavanderia lavanderia = new Lavanderia(); try { lavanderia.lavarroupas(); catch (CalcaException cex) { //tratativa catch (LingerieException lex) { //tratativa 19
As exceções são Polimórficas. TRATAMENTO DE ERROS Exception IOException RoupaException CalcaException LingerieException CamisaException CamisetaException CamisaSocialException 20
As exceções são Polimórficas. Você pode declarar exceções usando um supertipo das exceções que lançar. public void lavarroupas() throws RoupaException { Você pode capturar exceções usando um supertipo da exceção lançada. try { lavanderia.lavarroupas(); catch (RoupaException rex) { //tratativa 21
Só porque você pode capturar tudo com um superbloco catch polimórfico, não quer dizer que sempre deva fazê-lo. try { lavanderia.lavarroupas(); catch (Exception ex) { //tratativa Esse bloco catch capturará QUALQUER exceção, portanto, você não saberá automaticamente o que deu errado. 22
Crie blocos diferentes para cada tipo de exceção que você tiver que manipular exclusivamente. try { lavanderia.lavarroupas(); catch (CamisetaException cex) { //tratativa de Camiseta Tratativas específicas catch (LingerieException lex) { //tratativa de Lingerie catch (RoupaException rex) { //tratativa das demais exceções Todas as outras exceções serão tratadas aqui. 23
Mas cuidado! Você não pode colocar cestas de roupas maiores em cima de cestas menores! try { lavanderia.lavarroupas(); catch (RoupaException rex) { //tratativa das demais exceções catch (LingerieException lex) { //tratativa de Lingerie catch (CamisetaException cex) { //tratativa de Camiseta O tamanho é importante quando temos vários blocos catch. O de cesta maior tem que ficar no final. Caso contrário, os de cestas menores serão inúteis. 24
E como eu faço para criar minha própria classe de exceção? 25
Através do uso do Polimorfismo, basta criar sua classe e estendê-la a partir da classe Exception. Repare que como a classe herda as características da classe Exception, onde há o construtor que recebe como parâmetro um valor em String contendo a mensagem do erro, representada pela variável, da superclasse msg. Isto serve para ser usada o método getmessage() da classe Exception. public class CalcaException extends Exception { public CalcaException() { super(); public CalcaException(String msg) { super( msg ); 26
Mas e se eu não quiser tratar o erro, o que eu faço? Deixe para que outra pessoa trate por você! Quando você não quiser manipular, você pode desviar-se dela. public class Foo { public void go() throws RoupaException { Lavanderia lavanderia = new Lavanderia(); lavanderia.lavarroupas(); Mas lembre-se: Desviar o erro apenas retarda o inevitável. 27
Mas e se eu não quiser tratar o erro, o que eu faço? Deixe para que outra pessoa trate por você! Quando você não quiser manipular, você pode desviar-se dela. public class Foo { public void go() throws RoupaException { Lavanderia lavanderia = new Lavanderia(); lavanderia.lavarroupas(); Mas lembre-se: Desviar o erro apenas retarda o inevitável. 27
BIBLIOGRAFIA Introdução ao Java, Daniel Destro do Carmo Use a Cabeça Java, Kathy Sierra e Bert Bates Certificação Sun para Programador Java 6, Kathy Sierra e Bert Bates 28
OBRIGADO PROF. EMILIO PARMEGIANI DOWNLOAD DO MATERIAL 29