Throws e Throw new  XML
Índice dos Fóruns » Java Básico
Autor Mensagem
stone010
Thread.start()
[Avatar]

Membro desde: 16/10/2008 09:27:32
Mensagens: 34
Offline

Andei lendo bastante a respeito de tratamento de erros e fiquei um pouquinho confuso quanto ao uso da instrução throw.

Por exemplo, quando e como exatamente deve ser usado um throw e um throw new?

This message was edited 1 time. Last update was at 31/03/2009 08:13:20

fernandoeick
JavaEvangelist

Membro desde: 24/01/2007 14:18:48
Mensagens: 489
Localização: Campinas-SP
Offline

A palavra reservada throws vai na assinatura do método e indica que este método poderá lançar uma exceção que deve ou ser relançada ou capturada pelo método que a está chamando.

A palavra reservada throw new serve para lançar a exceção de dentro do corpo do método como em:


A parte de artigos do GUJ traz algo a respeito de tratamento de exceções. Acho que pode ser uma boa.
Att.

This message was edited 1 time. Last update was at 30/03/2009 09:43:05


Analista/Desenvolvedor Java
Graduado em Informática - Sistemas de Informação.
Sun Certified Java Programmer 6.0
Next Step: SCWCD 5

E dá-lhe Grêmio!
[MSN]
stone010
Thread.start()
[Avatar]

Membro desde: 16/10/2008 09:27:32
Mensagens: 34
Offline

Obrigado. Poderia postar um exemplo prático (pode ser simples mesmo) em que seria útil o uso de um "throw new"?

This message was edited 1 time. Last update was at 30/03/2009 10:01:09

jairelton
JavaChild

Membro desde: 23/06/2006 13:36:04
Mensagens: 108
Offline

Vale lembrar que a instrução não é throw new, mas somente throw. O new é para criar um novo objeto Exception e não faz parte do throw, você também pode lançar um objeto que já existe.

Jair Elton
fernandoeick
JavaEvangelist

Membro desde: 24/01/2007 14:18:48
Mensagens: 489
Localização: Campinas-SP
Offline

stone010 wrote:Obrigado. Poderia postar um exemplo prático (pode ser simples mesmo) em que seria útil o uso de um "throw new"?

Segue:

A regra para tratamento de exceções é: declare ou capture.

Qualquer dúvida posta aí....

This message was edited 3 times. Last update was at 30/03/2009 11:08:18


Analista/Desenvolvedor Java
Graduado em Informática - Sistemas de Informação.
Sun Certified Java Programmer 6.0
Next Step: SCWCD 5

E dá-lhe Grêmio!
[MSN]
stone010
Thread.start()
[Avatar]

Membro desde: 16/10/2008 09:27:32
Mensagens: 34
Offline

Sensacional Fernando. Já deu uma ótima clareada e já vejo outros exemplos que tenho com maior facilidade.

Então, o throws declarado na assinatura do método diz respeito a "Exception original". Ao optar por capturar através do catch no outro método bar(), eu tenho a opção de criar um novo objeto throw (throw new) para relançar essa excessão, correto?

Agora se entendi realmente bem, você poderia ter tratado a excessão diretamente no método main sem a necessidade de criar o "throw new" dentro do catch no método bar(), porém preferiu relançar a excessão somente para fim de esclarecer minha duvida correto?

Além disso tentando ir só um pouquinho mais a fundo, no método bar(), poderia ser o caso de você relançar a excessão, para uma "excessão de negócio" criado por mim mesmo certo? Tipo relançar o NumberFormatException para outra classe que eu criei estendendo Exception, chamada ficticialmente por exemplo, "NumeroInvalidoException", ou não?

Por exemplo, dentro do método bar():

This message was edited 6 times. Last update was at 30/03/2009 11:56:35

alexandre99
JavaTeenager

Membro desde: 26/02/2009 09:11:15
Mensagens: 183
Offline

sgsdg
Lavieri
GUJ Master
[Avatar]

Membro desde: 27/01/2004 13:39:31
Mensagens: 1851
Localização: João Pessoa / PB
Offline

Recomendo a leitura desses 3 textos, para não se perder no uso de exceções:
-> Exceções: Conceitos
-> Exceções: Boas Práticas, Más Práticas
-> Exceções: Classes Utilitárias

O que posso dizer de principal que há nesse texto é, seja especifico! ... e use as exceções ja existentes sempre q possivel...

Um exemplo de uso que fica facil



por exemplo, essa exceção, MaximumSizeException é uma exceção que eu criei, que extends IllegalArgumentException...
Ou seja, uma exeção especifica, gerada quando o argumento nome, é passado de forma ilegal, nesse caso especifico, qunado seu tamnho é maior que 45...
na minha exceção varios parametros são passados de forma a rastrear o erro... a classe source, ou seja, fonte do erro, (this) ... o nome da propriedade referente ao argumento que gerou o erro, no caso "nome" ... o valor da propriedade que gerou o erro (nome) ... o valor maximo do comprimento do nome (45) ...

ai depois é possivel resgatar essas informações quando a exceção é lançada...

This message was edited 1 time. Last update was at 30/03/2009 12:32:24


Sun Certified Java Programmer (SCJP 6)

"Any fool can write code that a computer can understand. Good programmers write code that humans can understand."
-Martin Fowler et al, Refactoring: Improving the Design of Existing Code, 1999

Meu blog -> http://blog.tomazlavieri.com.br/
[ICQ]
fernandoeick
JavaEvangelist

Membro desde: 24/01/2007 14:18:48
Mensagens: 489
Localização: Campinas-SP
Offline

stone010 wrote:Então, o throws declarado na assinatura do método diz respeito a "Exception original". Ao optar por capturar através do catch no outro método bar(), eu tenho a opção de criar um novo objeto throw (throw new) para relançar essa excessão, correto?


Correto, diz respeito a exceção original, recebida a partir de outro método. Ou então é uma exceção nova, recém lançada por este método mesmo.

stone010 wrote:Agora se entendi realmente bem, você poderia ter tratado a excessão diretamente no método main sem a necessidade de criar o "throw new" dentro do catch no método bar(), porém preferiu relançar a excessão somente para fim de esclarecer minha duvida correto?


Exato. Mas mesmo assim a assinatura do método bar deve permanecer igual. Somente o que tu tiraria seria o try/catch. A assinatura permaneceria igual para não quebrar a regra declare ou capture. Deixando somente a assinatura você está dizendo que está declarando/relançando.

stone010 wrote:Além disso tentando ir só um pouquinho mais a fundo, no método bar(), poderia ser o caso de você relançar a excessão, para uma "excessão de negócio" criado por mim mesmo certo? Tipo relançar o NumberFormatException para outra classe que eu criei estendendo Exception, chamada ficticialmente por exemplo, "NumeroInvalidoException", ou não?

Por exemplo, dentro do método bar():



Sim, você poderia fazer isso.


Analista/Desenvolvedor Java
Graduado em Informática - Sistemas de Informação.
Sun Certified Java Programmer 6.0
Next Step: SCWCD 5

E dá-lhe Grêmio!
[MSN]
stone010
Thread.start()
[Avatar]

Membro desde: 16/10/2008 09:27:32
Mensagens: 34
Offline

blz Fernando, valews jow, isso esclarece muita coisa cara.
vlws lavieri...

abraços
uncoloredmind
Entusiasta Java
[Avatar]

Membro desde: 15/12/2008 08:04:23
Mensagens: 24
Offline

jairelton wrote:Vale lembrar que a instrução não é throw new, mas somente throw. O new é para criar um novo objeto Exception e não faz parte do throw, você também pode lançar um objeto que já existe.


qual o efeito de lançar um objeto que ja existe?
vai retornar o que ?

fiquei na duvida
[MSN]
Lavieri
GUJ Master
[Avatar]

Membro desde: 27/01/2004 13:39:31
Mensagens: 1851
Localização: João Pessoa / PB
Offline

uncoloredmind wrote:
jairelton wrote:Vale lembrar que a instrução não é throw new, mas somente throw. O new é para criar um novo objeto Exception e não faz parte do throw, você também pode lançar um objeto que já existe.


qual o efeito de lançar um objeto que ja existe?
vai retornar o que ?

fiquei na duvida


esse aqui...

This message was edited 1 time. Last update was at 30/03/2009 16:41:31


Sun Certified Java Programmer (SCJP 6)

"Any fool can write code that a computer can understand. Good programmers write code that humans can understand."
-Martin Fowler et al, Refactoring: Improving the Design of Existing Code, 1999

Meu blog -> http://blog.tomazlavieri.com.br/
[ICQ]
 
Índice dos Fóruns » Java Básico
Ir para:   
Powered by JForum 2.1.8 © JForum Team