ClassCastException

8 respostas
J

Olá!!

Tenho um programa que lê um XML utilizando o org.w3c.dom.* Quando tento criar uma lista com os nomes das variantes que há no XML dá erro!

Parte do XML lido:
<padrao numero="7" nome="Realizar Acompanhamento" variante="S" opcional="N">
...
<variante numero="1" nome="Avaliações Educação Física">
...
<variante numero="2" nome="Avaliações Fisioterapia">
...
<variante numero="3" nome="Avaliações Terapia Ocupacional" />
Parte do código que dá erro:
public Vector getVariantes (String padrao){
	Vector variantes = new Vector();
    
	if (eVariante(padrao)){ 
		no = getTag("padrao");
		for (int i =0; i < no.getLength(); i++){
			Element elemento = (Element)no.item(i);
			//verifica se o padrao é o mesmo passado como parametro
			if (elemento.getAttribute("nome").equals(padrao)){
				i = no.getLength() +1;
				NodeList lista = elemento.getChildNodes();
				for (int j=0; j<lista.getLength(); j++){
					elemento = (Element)lista.item(j); // ** ERRO !!! **
					//define os atributos das tabelas, analisando a tag atributo
					if( elemento.getTagName().equals("variante")){
						variantes.addElement(elemento.getAttribute("nome"));
					}
				}
			}
		}
	}
	return variantes;
 }

O erro na execução de "elemento = (Element)lista.item(j);":
java.lang.ClassCastException
at gerador.XMLManager.getVariantes(XMLManager.java:208)
at gerador.FrameGerador.elaboraPanelPadroes(FrameGerador.java:372)
at gerador.FrameGerador.btnAvancar_actionPerformed(FrameGerador.java:681)
at gerador.FrameGerador$8.actionPerformed(FrameGerador.java:191)
at javax.swing.AbstractButton.fireActionPerformed(AbstractButton.java:1786)
at javax.swing.AbstractButton$ForwardActionEvents.actionPerformed(AbstractButton.java:1839)
at javax.swing.DefaultButtonModel.fireActionPerformed(DefaultButtonModel.java:420)
at javax.swing.DefaultButtonModel.setPressed(DefaultButtonModel.java:258)
at javax.swing.plaf.basic.BasicButtonListener.mouseReleased(BasicButtonListener.java:245)
at java.awt.Component.processMouseEvent(Component.java:5100)
at java.awt.Component.processEvent(Component.java:4897)
at java.awt.Container.processEvent(Container.java:1569)
at java.awt.Component.dispatchEventImpl(Component.java:3615)
at java.awt.Container.dispatchEventImpl(Container.java:1627)
at java.awt.Component.dispatchEvent(Component.java:3477)
at java.awt.LightweightDispatcher.retargetMouseEvent(Container.java:3483)
at java.awt.LightweightDispatcher.processMouseEvent(Container.java:3198)
at java.awt.LightweightDispatcher.dispatchEvent(Container.java:3128)
at java.awt.Container.dispatchEventImpl(Container.java:1613)
at java.awt.Window.dispatchEventImpl(Window.java:1606)
at java.awt.Component.dispatchEvent(Component.java:3477)
at java.awt.EventQueue.dispatchEvent(EventQueue.java:456)
at java.awt.EventDispatchThread.pumpOneEventForHierarchy(EventDispatchThread.java:201)
at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:151)
at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:145)
at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:137)
at java.awt.EventDispatchThread.run(EventDispatchThread.java:100)

O que fazer?? Parece que o problema está em que lista.item(j) é um Node, mas eu preciso que ele seja um Element, para análise futura... Como resolvo isso?? Alguma dica de codificação??

8 Respostas

R

que IDE vc está usando?
quando vc acaba o método, a ferramenta naum reclama de erro, ou e’ so’ quando compila mesmo…?

J

Utilizo Eclipse 3.0 com Java SDK SE 1.4.2.

O erro não é nem na compilação, ele ocorre só na execução do programa, e trava neste ponto!

Este programa já estava em uso, porém estou fazendo algumas modificações, mas nesta parte nem mexi, não sei o que pode ser…

R

amanha no servico eu vou dar uma pesquisada, depois te retorno.

blz?

R

olha, dei uma olhada no seu código e identifiquei isto(não sei se é correto)…

Element elemento = (Element)no.item(i);

no código acima você atribui um node ao element.

elemento = (Element)lista.item(j);

aqui vc faz a mesma coisa com o mesmo element, certo?

existe um método:

element.replaceChild(Node newChild, Node oldChild);

que substitui o elemento.

Naum vou te garantir, mas como vc está atribuindo dois NodeList ao mesmo elemento isto pode ser o motivo da class cast exception.

Espero ter ajudado

R

conseguiu resolver…?

J

Oi! Estava em férias esta semana e não tinha testado sua dica… Mas então, não funcionou!

Tanto no quanto lista são NodeList. O método não funciona para eles, só para Nodes. E no javadoc, este replaceChild é para um Node, e não um Element… mesmo assim funcionaria fazendo element.replaceChild??

Tentei “clonar” um elemento2, recebendo elemento, logo antes de criar a NodeList lista, mas o ClassCastException dado é o mesmo e no mesmo local…

Alguma outra dica?? Agradeço qq idéia desde já!

R

putz july…

acho que vou ficar te devendo…
naum sei mais o que pensar pra te ajudar…

de qualquer forma prometo que vou continuar pesquisando e qualquer coisa eu aviso…

Obs: Caso vc encontre a solução tb, posta ae…, blz?

J

Valeu a ajuda, mas consegui resolver o problema:

When you iterate over the children of an Element, be sure that you only subcast Node to Element when the Node really is an Element. If you subcast a Text Node to Element, for example, you get a ClassCastException.
em http://java.sun.com/developer/EJTechTips/2003/tt0728.html#2 elucidou !!

Coloquei uns instanceof do tipo:

if (no.item(i) instanceof Element){ Element elemento = (Element)no.item(i); } e funcionou!

Obrigada pela atenção,
July

Criado 2 de fevereiro de 2005
Ultima resposta 25 de fev. de 2005
Respostas 8
Participantes 2