certo, ou não. O caso comum é o de liberar um recurso no finally, como um arquivo ou conexão com banco algo tenha falhado nomais decorrer do código. de dados, para que possamos ter a certeza de que aquele arquivo (ou conexão) vá ser fechado, mesmo que exemplo seguir, o bloco finally será executado - não importa se tudo ocorrer ok ou com algum algo No tenha falhadoa no decorrer do código. problema: No exemplo a seguir, o bloco finally será executado - não importa se tudo ocorrer ok ou com algum problema: try { // bloco try } catch (IOException ex) { try { Instituto Federal de Educação, Ciência e Tecnologia da Bahia – // bloco bloco try catch 1 // catch (IOException (SQLExceptionex) sqlex) { Irecê }} catch { Campus // bloco bloco catch catch 12 // Disciplina: Linguagem Técnica I finally { }} catch (SQLException sqlex) { o Jonatas Bastos Prof // bloco bloco catch finally // 2 }} finally { Nome: _________________________________________________________________ // bloco finally } LISTA DE EXERCÍCIO 8 – Exceções 11.11 - Exercícios: Exceções 1 - Na classe Conta, modifique o método deposita(double x): Ele deve lançar uma 11.11 - Exercícios: Exceções exception chamada IllegalArgumentException, que já faz parte da biblioteca do java, 1) Na classe Conta, modifique o método deposita(double x): Ele deve lançar uma exception chamada sempre que o valor passado como argumento for inválido exemplo, quando for como IllegalArgumentException , que já faz parte da biblioteca do java, (por sempre que o valor passado 1) negativo). Na classe Conta , modifique o método deposita(double argumento for inválido (por exemplo, quando for negativo). x): Ele deve lançar uma exception chamada IllegalArgumentException, que já faz parte da biblioteca do java, sempre que o valor passado como void deposita(double valor) { quando for negativo). argumento for inválido (por exemplo, (valor < 0) { valor) { void if deposita(double throw new IllegalArgumentException(); if (valor } else { < 0) { throw new IllegalArgumentException(); this.saldo += valor - 0.10; }} else { this.saldo += valor - 0.10; } } } - Crie classe TestaDeposita o método main. Crie uma ContaPoupanca e tentevalores 2) 2Crie umauma classe TestaDeposita com ocom método main. Crie uma ContaPoupanca e tente depositar depositar valores inválidos: inválidos: 2) Crie uma classe TestaDeposita com o método main. Crie uma ContaPoupanca e tente depositar valores public static void main(String[] args) { inválidos: Material do Treinamento Java e Orientação a Objetos Conta cp =void new main(String[] ContaPoupanca(); public static args) { Conta cp = new ContaPoupanca(); Capítulo 11 - Controlando os erros com Exceções - Para saber mais: finally - Página 137 cp.deposita(-100); Capítulo 11 - Controlando os erros com Exceções - Para saber mais: finally - Página 137 } queacontece? acontece? Uma Uma IllegalArgumentException IllegalArgumentException é lançada uma vez que tentamos depositar OOque é lançada uma vez que tentamos inválido. Adicione o try/catch para tratar o erro: depositar um valor inválido. Adicione o try/catch para tratar o erro: um valor public static void main(String[] args) { Conta cp = new ContaPoupanca(); try { cp.deposita(-100); } catch (IllegalArgumentException e) { System.out.println("Você tentou depositar um valor inválido"); } } Atenção: se a sua classe ContaCorrente está reescrevendo o método deposita e não utiliza do super.deposita, ela não lançará a exception no caso do valor negativo! Você pode resolver isso utilizando o super.deposita, ou fazendo apenas o teste com ContaPoupanca. 3) Ao lançar a IllegalArgumentException, passe via construtor uma mensagem a ser exibida. Lembre que cp.deposita(-100); } cp.deposita(-100); } O que acontece? Uma IllegalArgumentException é lançada uma vez que tentamos depositar um valor inválido. Adicione o try/catch para tratar o erro: cp.deposita(-100); cp.deposita(-100); O que acontece? Uma IllegalArgumentException é lançada uma vez que tentamos depositar um valor }}inválido. Adicione o try/catch para tratar o erro: public static void main(String[] args) { static main(String[] args) { O que acontece? Uma IllegalArgumentException éé lançada Opublic que acontece? Uma IllegalArgumentException lançada uma uma vez vez que que tentamos tentamos depositar depositar um um valor valor Conta cp = void new ContaPoupanca(); inválido. inválido. Adicione Adicione oo try/catch try/catch para para tratar tratar oo erro: erro: Conta cp = new ContaPoupanca(); try { public void public static static void main(String[] main(String[] args) args) {{ cp.deposita(-100); try { } catch (IllegalArgumentException e) { cp.deposita(-100); Conta cp ContaSystem.out.println("Você cp == new new ContaPoupanca(); ContaPoupanca(); tentou depositar um valor inválido"); } catch (IllegalArgumentException e) { } try {{System.out.println("Você tentou depositar um valor inválido"); } try } cp.deposita(-100); cp.deposita(-100); } }} catch catch (IllegalArgumentException (IllegalArgumentException e) e) {{ Atenção:System.out.println("Você sea asua sua classe ContaCorrente estáreescrevendo reescrevendo ométodo métododeposita deposita e não utiliza do Atenção: se classe ContaCorrente está e não utiliza tentou um System.out.println("Você tentou depositar depositar um valor valoroinválido"); inválido"); } super.deposita , ela não lançará a exception no caso do valor negativo! Você pode resolver isso utilizando o } do super.deposita, não ContaCorrente lançará a exception no caso doo valor negativo! Atenção: se a suaela classe está reescrevendo método depositaVocê e nãopode utiliza do }}super.deposita, ou fazendo apenas o teste com ContaPoupanca. resolver isso utilizando o super.deposita, oucaso fazendo apenas o teste com ContaPoupanca. super.deposita , ela não lançará a exception no do valor negativo! Você pode resolver isso utilizando o super.deposita , ou fazendo apenas o teste comvia ContaPoupanca . 3) Ao lançar a IllegalArgumentException , passe construtor uma mensagem a ser exibida. Lembre que Atenção: se aa asua classe ContaCorrente está reescrevendo oo método deposita ee não do se sua classe ContaCorrente está reescrevendo método deposita não utiliza 3Atenção: Ao lançar IllegalArgumentException, passe via construtor uma mensagem a utiliza ser a String recebida como parâmetro é acessível depois via o método getMessage() herdado por todas do as 3) super.deposita Ao lançar a IllegalArgumentException , passe via construtor uma mensagem a ser exibida. Lembre que , ela não lançará a exception no caso do valor negativo! Você pode resolver isso utilizando oo super.deposita , ela não lançará a exception no caso do valor negativo! Você pode resolver isso utilizando Exceptions . exibida. Lembre que a String recebida como parâmetro é acessível depois via o método a String recebida como parâmetro é acessível depois via o método getMessage() herdado por todas as super.deposita , ou fazendo apenas o teste com ContaPoupanca . super.depositaherdado , ou fazendo o teste com ContaPoupanca. getMessage() porapenas todas as Exceptions. Exceptions . void deposita(double valor) { 3) 3) Ao Ao lançar lançar aa IllegalArgumentException IllegalArgumentException,, passe passe via via construtor construtor uma uma mensagem mensagem aa ser ser exibida. exibida. Lembre Lembre que que { éé acessível aavoid String recebida como parâmetro String recebida como parâmetro acessível depois depois via via oo método método getMessage() getMessage() herdado herdado por por todas todas as as ifdeposita(double (valor < 0) { valor) Exceptions .. Exceptions throw new IllegalArgumentException("Você tentou depositar um valor negativo"); if (valor < 0) { } else { throw new IllegalArgumentException("Você tentou depositar um valor negativo"); void void deposita(double deposita(double valor) this.saldo += valor) valor {{- 0.10; } else { } this.saldo if << 0) if (valor (valor 0) {{+= valor - 0.10; } } throw throw new new IllegalArgumentException("Você IllegalArgumentException("Você tentou tentou depositar depositar um um valor valor negativo"); negativo"); } }} else else {{ this.saldo += 0.10; this.saldo += valor valor --para 0.10; 4) Altere sua classe TestaDeposita exibir a mensagem da exceção através da chamada do getMessage(): }} 4) }}Altere classevoid TestaDeposita para args) exibir a{mensagem da exceção através da chamada do getMessage(): publicsua static main(String[] 4public - Altere sua classe TestaDeposita exibir a mensagem da exceção através da static main(String[] args)para { Conta cp = void new ContaPoupanca(); chamada do getMessage(): 4) TestaDeposita 4) Altere Altere sua sua classe classe TestaDeposita para para exibir exibir aa mensagem mensagem da da exceção exceção através através da da chamada chamada do do getMessage() getMessage():: Conta cp = new ContaPoupanca(); try { public static static void main(String[] main(String[] args) args) {{ public void cp.deposita(-100); try { } catch (IllegalArgumentException e) { Contacp.deposita(-100); cp == new new ContaPoupanca(); ContaPoupanca(); Conta cp System.out.println(e.getMessage()); } catch (IllegalArgumentException e) { } try {{System.out.println(e.getMessage()); try } } cp.deposita(-100); cp.deposita(-100); } }} catch catch (IllegalArgumentException (IllegalArgumentException e) e) {{ System.out.println(e.getMessage()); System.out.println(e.getMessage()); 5) Crie sua própria Exception, ValorInvalidoException. Para isso, você precisa criar uma classe com esse }} que estenda de RuntimeException. nome 5) }}Crie sua própria Exception, ValorInvalidoException. Para isso, você precisa criar uma classe com esse nome estenda de RuntimeException class que ValorInvalidoException extends. RuntimeException { 5Crie - Crie sua própria Exception, ValorInvalidoException. isso, vocêcriar precisa criar uma class extends RuntimeException { Para 5) Crie suaValorInvalidoException própria Exception Exception,, ValorInvalidoException ValorInvalidoException Para isso, isso, você precisa precisa criar uma classe classe com com esse esse 5) sua própria .. Para você uma classe com esse nome que estenda de RuntimeException. nome que estenda de RuntimeException . nome que estenda de RuntimeException . } } class ValorInvalidoException ValorInvalidoException extends extends RuntimeException RuntimeException {{ class Capítulo 11 - Controlando os erros com Exceções - Exercícios: Exceções - Página 138 }} Capítulo 11 - Controlando os erros com Exceções - Exercícios: Exceções - Página 138 Capítulo 11 11 -- Controlando Controlando os os erros erros com com Exceções Exceções -- Exercícios: Exercícios: Exceções Exceções--Página Página138 138 Capítulo Material do Treinamento Java e Orientação a Objetos Material do Treinamento Java e Orientação a Objetos Lance-a em vez de IllegalArgumentException. Atenção: sempre é interessante criarmos um novo tipo de exception! Depende do Lance-a emnem vez de IllegalArgumentException . caso. Nestevez aqui, seria melhor ainda utilizarmos IllegalArgumentException. A boa prática Lance-a em de IllegalArgumentException Atenção: nem sempre é interessante criarmos .um novo tipo de exception! Depende do caso. Neste aqui, diz que devemos preferir usar as já existentes do Java sempre que possível. seria melhor ainda utilizarmos IllegalArgumentException. A boa prática diz que devemos preferir usar as já Atenção: nem sempre é interessante criarmos um novo tipo de exception! Depende do caso. Neste aqui, existentes doainda Java sempre queIllegalArgumentException possível. seria melhor utilizarmos . A boa prática que diz que devemos preferir usar as já 6Coloque um constructor na classe ValorInvalidoException receba valor invalid existentes do Java sempre que possível. 6) que (opcional) Coloque um construtor ValorInvalidoException que Q receba valor inválido queuma ele tentou ele tentou passar (isto é, na eleclasse vai receber um double valor). uando estendemos passar (isto é, ele vai double valor ). podemos acessá-los não herdamos seus um construtores, mas atravésvalor da inválido palavraque chave 6) classe, (opcional) Coloque umreceber construtor na classe ValorInvalidoException que receba ele tentou Quando estendemos não herdamos construtores, mas podemos acessá-los através da passar de (isto é, ele vai receber um double valor ). seus do super dentro de uma um classe, construtor. As exceções Java possuem uma série de construpalavra chave super de dentro de um construtor. As exceções do Java possuem uma série de construtores úteis para poder com uma mensagem de erro. Então vamos criar através um Quando estendemos umapopula-las classe, nãojáherdamos seus construtores, mas podemos acessá-los da tores úteis para poder popula-las já com uma mensagem de erro. Então vamos criar um construtor em palavra chave super de dentro de um construtor. As exceções do Java possuem uma mãe. série de construconstrutor em ValorInvalidoException que delegue para o construtor de sua Essa ValorInvalidoException que delegue para o construtor de sua mãe. Essa vai guardar essa mensagem toresguardar úteis para popula-las com uma mensagem Entãoovamos criar um construtor em vai essapoder mensagem parajá poder monstra-la ao :de ser erro. invocado método getMessage: para poder monstra-la ao ser invocado o método getMessage ValorInvalidoException que delegue para o construtor de sua mãe. Essa vai guardar essa mensagem para poder monstra-la ao ser invocado o método getMessage: class ValorInvalidoException extends RuntimeException { class ValorInvalidoException extends RuntimeException { } ValorInvalidoException(double valor) { super("Valor invalido: " + valor); ValorInvalidoException(double valor) { } super("Valor invalido: " + valor); } } Dessa maneira,nanahora hora de dar o throw new ValorInvalidoException você vai precisar Dessa maneira, de dar o throw new ValorInvalidoException você vai precisar passar esse valor como argumento: passar esse valor como argumento: Dessa maneira, na hora de dar o throw new ValorInvalidoException você vai precisar passar esse valor como argumento: if (valor < 0) { if (valor < 0)ValorInvalidoException(valor); { throw new } throw new ValorInvalidoException(valor); } Atenção! Você pode se aproveitar do Eclipse para isso: comece já passando o valor como argumento para construtor da exception, e o eclipse vai reclamar que não filha existe tal construtor. O quick em fix vai sugerir que 7oAtenção! - Declare classe ValorInvalidoException como de Exception vez de para Vocêa pode se aproveitar do Eclipse para isso: comece jádireta passando o valor como argumento ele seja construindo, poupando-lhe tempo! RuntimeException. passa vai a ser checked. O que resulta? VOocê vai o construtor da exception, Ela e o eclipse reclamar que não existeisso tal construtor. quick fix precisar vai sugerir que ele seja construindo, tempo! avisar que o seu métodoValorInvalidoException deposita() throws ValorInvalidoException, pois ela éem uma 7) (opcional) Declare apoupando-lhe classe como filha direta de Exception vez de checked exception. Além quem chama esse método vai precisar tomar uma RuntimeException . Ela passa a serdisso, checked. O que isso resulta? 7) (opcional) Declare a classe ValorInvalidoException como filha direta de Exception em vez de decisão entre try-catch ou throws. Façaresulta? uso ValorInvalidoException do quick fix do, pois Eclipse Você vai precisar que oa ser seuchecked. método deposita() ela é uma RuntimeException .avisar Ela passa O que isso throws novamente! epois,disso, retorne exception para unchecked, isto uma é, para ser entre filhatry-catch de checked exception.DAlém quemachama esse método vai precisar tomar decisão Você vai precisar avisar que o seu método deposita() throws ValorInvalidoException, pois ela é uma RuntimeException, pois utilizá-la assim em exercícios dos capítulos ou throws . Faça uso do quick fix doiremos Eclipse novamente! checked exception. Além disso, quem chama esse método vai precisar tomar uma decisão entre try-catch posteriores. Depois, retorne exception para isto é, para ser filha de RuntimeException, pois iremos utilizá-la ou throws . Façaauso do quick fix unchecked, do Eclipse novamente! assim em exercícios dos capítulos posteriores. Depois, retorne a exception para unchecked, isto é, para ser filha de RuntimeException, pois iremos utilizá-la assim em exercícios dos capítulos posteriores. 11.12 - Desafios 11.12 - Desafios 1) O que acontece se acabar a memória da java virtual machine? Como forçar isso? 1) O que acontece se acabar a memória da java virtual machine? Como forçar isso? 11.13 - Discussão em aula: catch e throws em Exception 11.13 - Discussão em aula: catch e throws em Exception Existe uma péssima prática de programação em java que é a de escrever o catch e o throws com Exception. Existe uma péssima prática de programação em java que é a de escrever o catch e o throws com Exception.