1 - Na classe Conta, modifique o método deposita

Propaganda
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.
Download