Dúvidas em Exceções  XML
Índice dos Fóruns » Java Básico
Autor Mensagem
jPscoralicK
JavaChild
[Avatar]

Membro desde: 05/05/2007 09:54:44
Mensagens: 128
Localização: Juiz de Fora, MG
Offline

Fala pessoal.

Fiz aqui um "projeto" bem simples que tem duas classes: Ponto e Circulo. No construtor da classe Circulo, são passados como parâmetro o raio (int) e um objeto p da classe Ponto.

Como tratamento de exceções, incluí na assinatura do construtor: throws NullPointerException, IllegalArgumentException, para evitar que o ponto passado como argumento tenha referência nula e que o raio passado seja negativo.

Até aí tudo bem. Só que, quando criei a aplicação com o main e criei um objeto Circulo com parâmetro null para o ponto e, por exemplo, o valor negativo -5 para o raio, só era impresso a exceção para o raio, isto é, não era identificado a referênia null do ponto.

Para tratar esse erro, fui aconselhado a acrescentar o seguinte código ao construtor:




Contudo, o erro persistiu. Alguém sabe o que está acontecendo? O código acima é necessário?

Seguem abaixo o construtor e parte do main:

CONSTRUTOR




PARTE DO MAIN




Obrigado!



João Paulo Scoralick
Ciência da Computação - UFJF/MG
http://anouterview.blogspot.com
http://escape13.blogspot.com

[WWW] [MSN] [ICQ]
Yky Mattshawn
Virtual Machine Man
[Avatar]
Membro desde: 18/12/2006 03:34:14
Mensagens: 651
Localização: São Sebastião do Caí / RS
Offline

Está correto, cara.

Quando você usa vários catch's, o primeiro que capturar a excessão "trava" a execução dos blocos catch's adjacentes, mesmo que hajam mais catch's elegíveis à frente. O que ocorre é que, mesmo que você tenha passado 2 parâmetros incorretos, somente a primeira excessão é lançada.

Quando seu programa chega nessa linha:



A execução pula para os blocos catch's, então, o catch (IllegalArgumentException) não é executado.

Veja o try... catch: caso uma excessão seja lançada dentro do bloco try, a execução é "pulada" para o primeiro catch que capture a excessão corretamente. Seguindo essa dedução da execução, basta você imaginar o seu método como se estivesse totalmente dentro de um bloco try, no momento que a excessão ser lançada, ele pára de executar e o tratamento da excessão começa (ou não) em blocos catch.

Espero não ter sido demasiado prolixo oO.


Yky Mattshawn [ Compusoft - Desenvolvimento de Sistemas Empresariais ]
"Tudo que é ortodoxo ou heterodoxo demais gera heresia."
Bixo 2010 - Ciência da Computação - Feevale/RS e Unisinos/RS
[Email] [MSN] [ICQ]
thingol
Moderador

Membro desde: 29/07/2004 16:10:13
Mensagens: 17543
Offline

Se você sabe que um determinado método pode ter muitos erros, em vez de fazê-lo lançar exceções, você pode coletar as exceções em uma lista, e depois tratar o que for necessário. Exemplo:

[WWW]
Marky.Vasconcelos
Moderador
[Avatar]

Membro desde: 11/04/2007 18:18:20
Mensagens: 5932
Localização: São Paulo/SP
Offline

Por favor quando postar códigos coloque os entre as tags [ code] e [ /code]

Facebook @MarkyHitchhiker +Mark WP: MarkyTech's

Projects:
Android Roadmap - Aprenda Android do inicio (Java é o unico pre-requisito)
Towel ( ObjectTableModel & Swing & Utils )
Tower Defense Game - Java2D [Open-Source] [How-to-play]
EVGD: Programação de jogos (links) Ponto V! - Desenvolvimento de jogos para indies, curiosos e profissionais

DefaultTableModel?! PARE! Não faça isso! Faça melhor!

Dicas: Faça perguntas inteligentes! ; MigLayout ; GridBagLayout (Joke)

Develop games is fantastic, with words you can make worlds!!!

DON'T PANIC!
MarkyHitchhiker's Blog!
[WWW] [MSN]
jPscoralicK
JavaChild
[Avatar]

Membro desde: 05/05/2007 09:54:44
Mensagens: 128
Localização: Juiz de Fora, MG
Offline

Valeu pessoal, entendi.

Mas, só mais um esclarecimento:

mesmo colocando o código abaixo na assinatura do método



ainda assim preciso colocar os "ifs" do raio e do ponto dentro do método?

[]s

João Paulo Scoralick
Ciência da Computação - UFJF/MG
http://anouterview.blogspot.com
http://escape13.blogspot.com

[WWW] [MSN] [ICQ]
jPscoralicK
JavaChild
[Avatar]

Membro desde: 05/05/2007 09:54:44
Mensagens: 128
Localização: Juiz de Fora, MG
Offline

jPscoralicK wrote:Valeu pessoal, entendi.

Mas, só mais um esclarecimento:

mesmo colocando o código abaixo na assinatura do método



ainda assim preciso colocar os "ifs" do raio e do ponto dentro do método?

[]s


?

João Paulo Scoralick
Ciência da Computação - UFJF/MG
http://anouterview.blogspot.com
http://escape13.blogspot.com

[WWW] [MSN] [ICQ]
jPscoralicK
JavaChild
[Avatar]

Membro desde: 05/05/2007 09:54:44
Mensagens: 128
Localização: Juiz de Fora, MG
Offline

alguém poderia me responder?

João Paulo Scoralick
Ciência da Computação - UFJF/MG
http://anouterview.blogspot.com
http://escape13.blogspot.com

[WWW] [MSN] [ICQ]
LPJava
GUJ Hacker

Membro desde: 18/04/2006 12:50:23
Mensagens: 5524
Localização: Bahia/Porto Alegre
Offline

assim sua pergunta nao entendi poe ai a sintaxe o que quer fazer.. mais respondendo de modo geral, vc tem ai exceções nao verificadas onde nao vai ter obrigação nenhuma de declarar ou tratar.. to falando de modo geral.. mais poe sua duvida o que quer fazer...

Sun Certified Java Programmer 5.0
Blog:http://www.camilolopes.com
Twitter:www.twitter.com/camilolope
Linkedin: http://br.linkedin.com/in/camilolopes
Curso online OCPJP: http://pro.imasters.com.br/online/cursos/preparatorio-para-certificacao-java-ocjp
Autor livro Guia SCJP & JEE c/ Frameworks: http://blog.camilolopes.com.br/livrosrevistaspalestras/
[WWW]
Yky Mattshawn
Virtual Machine Man
[Avatar]
Membro desde: 18/12/2006 03:34:14
Mensagens: 651
Localização: São Sebastião do Caí / RS
Offline

jPscoralicK wrote:Valeu pessoal, entendi.

Mas, só mais um esclarecimento:

mesmo colocando o código abaixo na assinatura do método



ainda assim preciso colocar os "ifs" do raio e do ponto dentro do método?

[]s


Para o IllegalArgumentException: Sim, você deve manter o seu if.

Entretanto, o if do NullPointerException você pode retirar pois, quando essa linha for executada:



Caso p (o parâmetro do construtor) seja nulo, o Java mesmo irá lançar uma NullPointerException.


Yky Mattshawn [ Compusoft - Desenvolvimento de Sistemas Empresariais ]
"Tudo que é ortodoxo ou heterodoxo demais gera heresia."
Bixo 2010 - Ciência da Computação - Feevale/RS e Unisinos/RS
[Email] [MSN] [ICQ]
jPscoralicK
JavaChild
[Avatar]

Membro desde: 05/05/2007 09:54:44
Mensagens: 128
Localização: Juiz de Fora, MG
Offline

Segue o código:




A minha dúvida é a seguinte: mesmo colocando na assinatura do método o throws NullPointerException,
IllegalArgumentException
, eu preciso fazer os dois "ifs" dentro do método?

Porque, pelo o que eu li, quando você coloca o "throws" na assinatura, não é preciso fazer "mais nada" relativo a exceções dentro do método.



João Paulo Scoralick
Ciência da Computação - UFJF/MG
http://anouterview.blogspot.com
http://escape13.blogspot.com

[WWW] [MSN] [ICQ]
Yky Mattshawn
Virtual Machine Man
[Avatar]
Membro desde: 18/12/2006 03:34:14
Mensagens: 651
Localização: São Sebastião do Caí / RS
Offline

Cara, é que tipo: declarar através do throws obriga ao código que chamará seu método/construtor a capturar e/ou repassar a excessão. Ou seja, a excessão não poderá ser "simplesmente ignorada".

Já respondi em relação aos if's cara. Você só precisa criar o if para a IllegalArgumentException, caso contrário, uma IllegalArgumentException nunca será lançada pelo seu contrutor (não neste caso).


Yky Mattshawn [ Compusoft - Desenvolvimento de Sistemas Empresariais ]
"Tudo que é ortodoxo ou heterodoxo demais gera heresia."
Bixo 2010 - Ciência da Computação - Feevale/RS e Unisinos/RS
[Email] [MSN] [ICQ]
jPscoralicK
JavaChild
[Avatar]

Membro desde: 05/05/2007 09:54:44
Mensagens: 128
Localização: Juiz de Fora, MG
Offline

Ok, Yky, obrigado.

Mas porque só a IllegalArgumentException tem que ser lançada?

João Paulo Scoralick
Ciência da Computação - UFJF/MG
http://anouterview.blogspot.com
http://escape13.blogspot.com

[WWW] [MSN] [ICQ]
LPJava
GUJ Hacker

Membro desde: 18/04/2006 12:50:23
Mensagens: 5524
Localização: Bahia/Porto Alegre
Offline

assim eu nao entendi ate agora pq vc ta tentando declarar exeções nao verificadas.. implicitamente elas acontece... segundo a kathy é valido declaracao e tratar exceções verificadas...

Sun Certified Java Programmer 5.0
Blog:http://www.camilolopes.com
Twitter:www.twitter.com/camilolope
Linkedin: http://br.linkedin.com/in/camilolopes
Curso online OCPJP: http://pro.imasters.com.br/online/cursos/preparatorio-para-certificacao-java-ocjp
Autor livro Guia SCJP & JEE c/ Frameworks: http://blog.camilolopes.com.br/livrosrevistaspalestras/
[WWW]
jPscoralicK
JavaChild
[Avatar]

Membro desde: 05/05/2007 09:54:44
Mensagens: 128
Localização: Juiz de Fora, MG
Offline

Ok, camilo.

Então, sempre que eu declarar uma exceção, eu tenho que obrigatoriamente lançá-la dentro do método?

João Paulo Scoralick
Ciência da Computação - UFJF/MG
http://anouterview.blogspot.com
http://escape13.blogspot.com

[WWW] [MSN] [ICQ]
Yky Mattshawn
Virtual Machine Man
[Avatar]
Membro desde: 18/12/2006 03:34:14
Mensagens: 651
Localização: São Sebastião do Caí / RS
Offline

jPscoralicK wrote:Ok, camilo.

Então, sempre que eu declarar uma exceção, eu tenho que obrigatoriamente lançá-la dentro do método?


Não. Ocorre que no seu caso nada dentro do seu construtor irá lançar uma IllegalArgumentException. Você declarou o throws IllegalArgumentException apenas para evitar que seja informado um valor errado, correto? Então, você é que tem que lançar a excessão. É complicado de explicar isso. Talvez alguém possa explanar isso de melhor forma.


Yky Mattshawn [ Compusoft - Desenvolvimento de Sistemas Empresariais ]
"Tudo que é ortodoxo ou heterodoxo demais gera heresia."
Bixo 2010 - Ciência da Computação - Feevale/RS e Unisinos/RS
[Email] [MSN] [ICQ]
 
Índice dos Fóruns » Java Básico
Ir para:   
Powered by JForum 2.1.8 © JForum Team