Java.lang.ClassCastException quando executo busca no BD para popular JTable

8 respostas
A

Ola pessoal, quando executo uma busca no banco de dados, eu recebo esse erro:

Exception in thread "AWT-EventQueue-0" java.lang.ClassCastException: [Ljava.lang.Object; cannot be cast to teste.ems2.model.Atividade
	at teste.ems2.application.Adm.Tables.ProjetoTableModelStandard.getValueAt(ProjetoTableModelStandard.java:135)
	at javax.swing.JTable.getValueAt(JTable.java:2716)
        ...

O codigo que uso para inserir valores em uma JTable com modeloAbstractTableModel é:

@Override
    public Object getValueAt(int indexRow, int indexColumn) {

        Activite ac = rows.get(indexRow);  //linha 135

        switch (indexColumn) {
            case 0:
                return ac.getNomActivite();
            case 1:
                return ac.getPhases().get(0).getDateDebut();
            case 2:
                return ac.getPhases().get(0).getDateFin();
            case 3:
                return ac.getPhases().get(0).getPourcentage();
            case 4:
                return ac.getPhases().get(1).getDateDebut();
            case 5:
                return ac.getPhases().get(1).getDateFin();
            case 6:
                return ac.getPhases().get(1).getPourcentage();
            case 7:
                return ac.getPhases().get(2).getDateDebut();
            case 8:
                return ac.getPhases().get(2).getDateFin();
            case 9:
                return ac.getPhases().get(2).getPourcentage();
            case 10:
                return ac.getPhases().get(3).getDateDebut();
            case 11:
                return ac.getPhases().get(3).getDateFin();
            case 12:
                return ac.getPhases().get(3).getPourcentage();
            case 13:
                return ac.getPhases().get(4).getDateDebut();
            case 14:
                return ac.getPhases().get(4).getDateFin();
            case 15:
                return ac.getPhases().get(4).getPourcentage();
            case 16:
                return ac.getPersonnes().get(0).getPreNom() + "  " + ac.getPersonnes().get(0).getNom();
            case 17:
                return ac.getPersonnes().get(1).getPreNom() + "  " + ac.getPersonnes().get(1).getNom();
            case 18:
                return ac.getPersonnes().get(2).getPreNom() + "  " + ac.getPersonnes().get(2).getNom();
            case 19:
                return ac.getPersonnes().get(3).getPreNom() + "  " + ac.getPersonnes().get(3).getNom();
            case 20:
                return ac.getPersonnes().get(4).getPreNom() + "  " + ac.getPersonnes().get(4).getNom();
            case 21:
                return ac.getNbHeureV();
            case 22:
                return ac.getNbHeureC();
            case 23:
                return ac.getNbHeureA();
            default:
                throw new IndexOutOfBoundsException("columnIndex out of bounds");
        }
    }

O codigo que uso para buscar na base de dados:

public List<Activite> findAllActiviteELEC(String tache) {
        
        try {
             return (List<Activite>) em.createQuery("SELECT ac, ta FROM Activite ac, Tache ta WHERE ac.group.nomGroupe = 'ELEC' and ta.nomTache = '"+tache+"'").getResultList();     
        } catch (NoResultException n) {
            return null;
        } finally {
            em.close();
        }
    }

Alguém sabe o motivo disso ? Ja procurei aqui no forum achei algumas coisas relacionadas, porém não consigo arrumar mesmo se eu fizer um Vetor de Objects[] e pegar cada indice, ele sempre da a mensagem que não pode ser convertido para o tipo do objeto Activite.

Muito obrigado !

8 Respostas

R

O erro esta no seu metodo getValueAt, pois ele pede retorno de um Object, e os seus return provavelmente estao vindo de outro tipo.

Experimento botar em cada return um cast para Object:

case 11:  
            return (Object)ac.getPhases().get(3).getDateFin();

Eu nao faria assim como voce esta fazendo, pois eu estando com o objeto preenchido, basta chama-lo onde eu precisar: ac.getPhases().get(0).getDateDebut();

A

rof20004:
O erro esta no seu metodo getValueAt, pois ele pede retorno de um Object, e os seus return provavelmente estao vindo de outro tipo.

Experimento botar em cada return um cast para Object:

case 11:  
            return (Object)ac.getPhases().get(3).getDateFin();

Eu nao faria assim como voce esta fazendo, pois eu estando com o objeto preenchido, basta chama-lo onde eu precisar: ac.getPhases().get(0).getDateDebut();

Sim, eu fiz como voce pensa, e é o que enviei, não sei como modificar o meu getValueAt para retornar o tipo de cada linha.
Em um teste que eu fiz durante a criacao da minha JTable, isso funcionou perfeitamente, o problema é o resultado do valor do findAll … que retorna List, ele não esta aceitando cast.

Eu sabia que o que voce disse não iria funcionar, porém eu tentei pra mandar pra voce o erro, que é o mesmo.

Exception in thread "AWT-EventQueue-0" java.lang.ClassCastException: [Ljava.lang.Object; cannot be cast to teste.ems2.model.Atividade at teste.ems2.application.Administrateur.table.ProjetoTableModelStandard.getValueAt(ProjeotTableModelStandard.java:135) at javax.swing.JTable.getValueAt(JTable.java:2716) ...

Abraco

robinsonbsilva

Andriel,

Não sei se vc está usando, mas é muito simples implementar um modelo de tabela(AbstractTableModel) e uma das vantagens desse tipo de implementação é que vc pode ter como retorno um tipo especifico de classe.

Dá uma lida aqui: http://www.javasimples.com.br/swing-awt/death-to-defaulttablemodel-abstracttablemodel-rulez

Vale a pena.

A

Sim, estou, olha o meu comentário do primeiro post.

robinsonbsilva

Perfeito!!

Cara, se possível gasta um tempo vendo o tutorial que passei, a idéia dessa implementação está bem refactorada.
Agora em relação ao seu erro, seria legal você “debugar” o registro que está causando o erro, só assim mesmo para saber em qual case “tal coluna” está entrando.

A

Nesse caso, ele não está entrando no case, ele para na atribuição da linha 135.

sendo que:

Agradeço pelo comentário. Mas creio que o pau está mesmo no método de busca, só não estou sabendo como arrumar.

Obrigado.

robinsonbsilva

andrielc,

Você consegue para a execução nessa linha, e antes da “atribuição” dar apenas

rows.get(indexRow); //Um watch ou inspect do eclipse

Para ver o que retorna?

O estranho disso é que seu List é de um tipo seguro, e aparentemente não é isso que está acontecendo.

A

robinsonbsilva:
andrielc,

Você consegue para a execução nessa linha, e antes da “atribuição” dar apenas

rows.get(indexRow); //Um watch ou inspect do eclipse

Para ver o que retorna?

O estranho disso é que seu List é de um tipo seguro, e aparentemente não é isso que está acontecendo.

Coloquei um wath no meu resultado e veio um Colection<Atividade,Tarefa>, então o Cast nunca funcionaria, logo, alterei a busca do find com uma UNION entre as duas tabelas, Grupo e Tarefa e retornou as atividades certinho.

Valeu pela dica! =)

Criado 3 de abril de 2013
Ultima resposta 4 de abr. de 2013
Respostas 8
Participantes 3