Como sobrescrever um método que não lança exceção e fazer ele lançar exceção? [RESOLVIDO]  XML
Índice dos Fóruns » Java Avançado
Autor Mensagem
diego_qmota
JavaEvangelist
[Avatar]

Membro desde: 28/09/2008 15:44:35
Mensagens: 346
Localização: Paulínia
Offline

Pessoal, boa tarde!

Gostaria de saber se há alguma técnica para contornar o seguinte problema:

Quero estender a classe DefaultTreeModel e sobrescrever o método abaixo:

Só que gostaria de fazer algumas verificações antes de permitir que seja inserido um nó na árvore (JTree). Caso algum critério não seja cumprido, queria disparar uma exceção (que iria para os níveis superiores até chegar ao usuário), impedindo assim que o nó (nosso TreeNode) fosse adicionado à árvore.

Ou seja.. após herdar a classe, fazer isso:


Têm alguma técnica que posso usar para contornar esse problema e poder lançar a exceção para cima? Técnica para adicionar lançamento de exceções em método herdado que originalmente não tinha (mantendo a herança dele) ?

Grato

This message was edited 2 times. Last update was at 30/12/2010 15:02:13


"Go ahead, make my day!"
rmendes08
GUJ Master
[Avatar]

Membro desde: 29/05/2008 14:09:28
Mensagens: 1617
Online

Sim, basta que sua exceção estenda java.lang.RuntimeException ao invés de estender java.lang.Exception diretamente. Assim o compilador não exigirá que sua exceção seja declarada na assinatura do método.

"A Técnica é transformada em Arte por quem a emprega"

"O futuro pertence àqueles que acreditam na beleza de seus sonhos"

Computadores Fazem Arte

http://www.uaijug.com.br

"É importante estabelecer uma estrutura de alto nível, mas isso não significa criar uma infinidade de diagramas de classes detalhados."
diego_qmota
JavaEvangelist
[Avatar]

Membro desde: 28/09/2008 15:44:35
Mensagens: 346
Localização: Paulínia
Offline

Ok, vou testar e informo se obter sucesso!

Valeu! Achava que esse problema era insolúvel ...

"Go ahead, make my day!"
marcobiscaro2112
JWizard

Membro desde: 01/12/2008 11:56:04
Mensagens: 2408
Localização: São Paulo - SP
Offline

Você pode lançar uma RuntimeException (que não é uma checked exception) que encapsula outra exceção.

Exemplo:

This message was edited 1 time. Last update was at 28/12/2010 17:26:47


Marco Biscaro.

Seja livre!

Você sabia que provavelmente há milhares de arquivos duplicados no seu computador?

Ei... você está usando DefaultTableModel no seu projeto?? Não faça isso! Veja: http://www.guj.com.br/posts/list/15/199067.java#1001295
[Email] [WWW] [MSN]
peczenyj
Moderador
[Avatar]

Membro desde: 26/03/2006 23:25:37
Mensagens: 3191
Localização: Rio de Janeiro
Offline

Vc precisa de uma classe que É UMA DefaultTreeModel?

Vc poderia usar composição ao inves de herança e ter uma classe X que TEM UM atributo que é uma DefaultTreeModel e vc adiciona / remove nesse cara e a sua classe se preocupa em validar de acordo com as suas regras.

Inclusive sua classe X poderia implementar a interface TreeModel para ser mais compativel com algumas coisas. Lançar RuntimeException quando vc quer validar de forma explicita se algo deu certo me parece um tanto errado.

Vejo outra opção: pense em criar a sua classe de forma imutavel e o insertBlaBlaBla retorna uma nova instancia da sua classe com estas alterações e um método isValid para verificar se o objeto é bacana ou não.

http://pacman.blog.br

'Não importa quanto alguém se dedique à tarefa. Ninguém consegue fazer a água da cascata cair para cima.'
[WWW]
diego_qmota
JavaEvangelist
[Avatar]

Membro desde: 28/09/2008 15:44:35
Mensagens: 346
Localização: Paulínia
Offline

peczenyj wrote:
Vc poderia usar composição ao inves de herança e ter uma classe X que TEM UM atributo que é uma DefaultTreeModel e vc adiciona / remove nesse cara e a sua classe se preocupa em validar de acordo com as suas regras.

Sim, poderia. Mas não poderia usar como filho do DefaultTreeModel. Teria que adaptar todas as classes para lidar com essa.


peczenyj wrote:
Inclusive sua classe X poderia implementar a interface TreeModel para ser mais compativel com algumas coisas. Lançar RuntimeException quando vc quer validar de forma explicita se algo deu certo me parece um tanto errado.

Sem dúvida. Mas como vou lidar só com String's, me parece um esforço desnecessário implementar um TreeModel personalizado só para lançar uma exceção se uma condição não for satisfeita...
Outra abordagem seria a que você apresentou acima. Que daí seria o mais "correto".

peczenyj wrote:
Vejo outra opção: pense em criar a sua classe de forma imutavel e o insertBlaBlaBla retorna uma nova instancia da sua classe com estas alterações e um método isValid para verificar se o objeto é bacana ou não.

Aí eu quebro o mecanismo de herança. Não quebro? O método é void:

Acho que uma alternativa melhor é criar uma interface com o método isValid. Daí eu checaria se o model implementa a interface e se o método isValid retorna true. Caso não retorne, eu já saberia que houve duplicação...


Resumindo: Acho o problema simples demais e insignificante para maiores preocupações. Será usado em alguns trechos do programa (3 trechos). Só é para checar se há elementos repetidos no modelo. Se houver, disparar uma exceção. A abordagem do Runtime parece interessante porque somente onde for interessante checar a duplicação e onde eu souber que estou usando o DefaultTreeModel herdado é que vou manipular essa exceção.

This message was edited 3 times. Last update was at 29/12/2010 08:02:18


"Go ahead, make my day!"
diego_qmota
JavaEvangelist
[Avatar]

Membro desde: 28/09/2008 15:44:35
Mensagens: 346
Localização: Paulínia
Offline

marcobiscaro2112 wrote:Você pode lançar uma RuntimeException (que não é uma checked exception) que encapsula outra exceção.

Exemplo:


Hoje de manhã vou testar e aviso. A idéia é essa mesma. Lançar "para cima" essa exceção, para ser manipulada nos métodos superiores da pilha, até chegar na interface gráfica (na classe do JFrame, que irá tratar a exceção).

This message was edited 1 time. Last update was at 29/12/2010 08:07:42


"Go ahead, make my day!"
marcobiscaro2112
JWizard

Membro desde: 01/12/2008 11:56:04
Mensagens: 2408
Localização: São Paulo - SP
Offline

A propósito, se você for usar a abordagem de encapsular a exceção, crie uma classe filha de RuntimeException, que você usará no seu catch. Exemplo:

No hora de tratar a exceção, faça um catch só para a sua exceção criada.

Isso é importante pois há pelo menos umas 50 subclasses diferentes de RuntimeException só na API padrão e capturar tudo isso em um catch fica muito genérico.

Marco Biscaro.

Seja livre!

Você sabia que provavelmente há milhares de arquivos duplicados no seu computador?

Ei... você está usando DefaultTableModel no seu projeto?? Não faça isso! Veja: http://www.guj.com.br/posts/list/15/199067.java#1001295
[Email] [WWW] [MSN]
diego_qmota
JavaEvangelist
[Avatar]

Membro desde: 28/09/2008 15:44:35
Mensagens: 346
Localização: Paulínia
Offline

A abordagem está funcionando. Estou conseguindo capturar a exceção em nível superior.

A propósito, se você for usar a abordagem de encapsular a exceção, crie uma classe filha de RuntimeException

Estou fazendo isso agora. É melhor mesmo, para evitar capturar outra RuntimeException...

This message was edited 1 time. Last update was at 29/12/2010 10:44:44


"Go ahead, make my day!"
ViniGodoy
Moderador
[Avatar]

Membro desde: 11/12/2006 08:22:01
Mensagens: 20580
Localização: Curitiba/PR
Offline

Só um detalhe. De que adianta seu TreeModel lançar uma exceção, se seu JTree não está preparado para captura essa mesma exceção?
Se o método não tem esse tipo de coisa no seu contrato, de nada adianta disparar a exception.

@ViniGodoy - Lattes

Tem dúvidas de Java? Poste no fórum! Não respondo dúvidas de java via MP!

Ponto V! - Desenvolvimento de Jogos Profissional - @Pontov - Facebook
Projeto Towel - Swing de uma forma inteligente (Novo lar do ObjectTableModel e do Auto-Filtro).

Ei... você está usando DefaultTableModel no seu projeto??
Não faça isso! Veja: http://www.guj.com.br/posts/list/15/199067.java#1001295
[WWW]
diego_qmota
JavaEvangelist
[Avatar]

Membro desde: 28/09/2008 15:44:35
Mensagens: 346
Localização: Paulínia
Offline

ViniGodoy wrote:Só um detalhe. De que adianta seu TreeModel lançar uma exceção, se seu JTree não está preparado para captura essa mesma exceção?
Se o método não tem esse tipo de coisa no seu contrato, de nada adianta disparar a exception.


A idéia é simples. É para capturar a exceção do TreeModel, mas não será o JTree que irá capturar.

As funções CRUD da JTree serão feitas por JButtons e JPopMenu. São nos ActionListeners dos botões e opções do JPopMenu é que vou capturar as exceções do TreeModel. Só vou usar a JTree para obter a instância do TreeModel. Esta instância será justamente uma instância da minha classe herdada da DefaultTreeModel, que encapsula a exceção dentro de uma RuntimeException.
Eu manipulo a instância do TreeModel e verifico se houve a exceção. Se tiver ocorrido, informo o usuário e desfaço as alterações no TreeModel (ou posso impedir de serem salvas).

This message was edited 1 time. Last update was at 30/12/2010 14:59:32


"Go ahead, make my day!"
diego_qmota
JavaEvangelist
[Avatar]

Membro desde: 28/09/2008 15:44:35
Mensagens: 346
Localização: Paulínia
Offline

Deu certo.

Minha aplicação, na interface gráfica, verifica se houve uma "ExceptionContainer" (a extensão que fiz da classe RuntimeException) e trata a exceção contida dentro dela (a que eu lanço da TreeModel, nos níveis mais inferiores, ao inserir e alterar nodos da árvore).
Essa exceção sobe as camadas, sem declarações de throws, sendo capturada só onde interessa e sem eu precisar criar um TreeModel do zero...

This message was edited 2 times. Last update was at 30/12/2010 15:00:37


"Go ahead, make my day!"
 
Índice dos Fóruns » Java Avançado
Ir para:   
Powered by JForum 2.1.8 © JForum Team