DAO dando exception

16 respostas
S

Estou apredendo DAO agora e estou fazendo uma aplicação mas está dando exception:

Exception in thread main java.lang.ClassCastException: persistencia.classes.MySQLDAOFactory cannot be cast to persistencia.interfaces.DAOPrograma

at persistencia.classes.MySQLDAOFactory.getDAOPrograma(MySQLDAOFactory.java:31)

at controle.controlePrograma.(controlePrograma.java:31)

at Telas.tela01.initialize(tela01.java:47)

at Telas.tela01.(tela01.java:38)

at inicio.Start.main(Start.java:6)

O que esta errado?

16 Respostas

euprogramador

Poderia ser mais especifico, colocando o código que está com problema?

nel

Boa tarde.

Estas duas linhas dizem tudo:

java.lang.ClassCastException: persistencia.classes.MySQLDAOFactory cannot be cast to persistencia.interfaces.DAOPrograma at persistencia.classes.MySQLDAOFactory.getDAOPrograma(MySQLDAOFactory.java:31)

A primeira indica que você está tentando atribuir um tipo incompatível a um determinado objeto. Seria como dizer que o seu Objeto Pessoa recebe um Objeto Veículo. A segunda linha mostra exatamente qual linha está ocorrendo o seu erro.

Se mesmo assim não conseguir identificar o que está ocorrendo, poste a classe. Não esqueça de utilizar as tags code.
Abraços.

S
package persistencia.interfaces;

import programas.Programa;

public interface DAOPrograma {
	
	public void incluir(Programa programa) throws Exception;


}
package persistencia.classes;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;

import persistencia.interfaces.DAOPrograma;

public class MySQLDAOFactory extends DAOFactory{
	
	private static java.sql.Connection con = null;
	
	public static Connection createConnection() throws Exception{
		if (con == null){
			try{
			//Class.forName("org.gjt.mm.mysql.Driver");//Declaração do driver
			Class.forName("com.mysql.jdbc.Driver");
			con = DriverManager.getConnection("jdbc:mysql://localhost/programas", "root", "vertrigo");
			}
			catch(ClassNotFoundException e){
				System.out.println("Classe n encontrada");
			}
			catch(SQLException e){
				System.out.println("SQL exception");
			}
		}
		return con;
	}
	
	public DAOPrograma getDAOPrograma() throws Exception{
		return (DAOPrograma) new MySQLDAOFactory();
	}

}
Y

Isso aí compila?

Porque tu definiste uma INTERFACE DAOPrograma e está mandando uma CLASSE extender essa interface. Até onde lembro, apenas interfaces podem extender interfaces. Uma classe deve implementar uma interface.

Desculpem se estou falando alguma besteira, hehe.

Alchemist

O nel disse tudo… ta tentando passar elefante onde deveria ser um rato… e está parada de interface ai tb ta estranha viu :s

S

Não, n te culpo n, estou com essa dúvida, pq faltei uma aula da facu e peguei de um cara q foi, eu fiz baseado no que ele fez, detalhe, o dele tb n funcionava.

Y

Ok. Primeiramente troque a nona linha do MySQLDAOFactory, ficando assim:

public class MySQLDAOFactory implements DAOFactory{

E vamos ver no que dá. Posta, então, o resultado da compilação.

nel

Seu erro:

public DAOPrograma getDAOPrograma() throws Exception{ //ele não aceita este tipo de Cast return (DAOPrograma) new MySQLDAOFactory(); }

E sim, as classes devem implementar uma Interface e não extender de uma interface. Compilar acredito que compila pois uma interface nada mais é que uma classe abstrata. Amigo, mude isso ok? Está bem estranho seu código.

cdorner

Yky Mattshawn:
Isso aí compila?

Porque tu definiste uma INTERFACE DAOPrograma e está mandando uma CLASSE extender essa interface. Até onde lembro, apenas interfaces podem extender interfaces. Uma classe deve implementar uma interface.

Desculpem se estou falando alguma besteira, hehe.

A classe que ele esta dando extends e na DAOFactory e não na DAOPrograma, por isso compila sim, :slight_smile:

para resolver o seu problema:

crie uma implementacao para DAOPrograma, ex DAOProgramaImpl

no metodo getDAOPrograma()

public DAOPrograma getDAOPrograma() throws Exception{   
        return new DAOProgramaImpl();   
    }

veja que o que vc quer retornar é uma implementação para DAOPrograma e não uma Factory, como estava fazendo.

S

Yky Mattshawn:
Ok. Primeiramente troque a nona linha do MySQLDAOFactory, ficando assim:

public class MySQLDAOFactory implements DAOFactory{

E vamos ver no que dá. Posta, então, o resultado da compilação.

quando coloquei apareceu o erro:
the type DAOFactory cannot be a superinterface of MySQLDAO, a superinterface musta be a interface

S

cdorner:
Yky Mattshawn:
Isso aí compila?

Porque tu definiste uma INTERFACE DAOPrograma e está mandando uma CLASSE extender essa interface. Até onde lembro, apenas interfaces podem extender interfaces. Uma classe deve implementar uma interface.

Desculpem se estou falando alguma besteira, hehe.

A classe que ele esta dando extends e na DAOFactory e não na DAOPrograma, por isso compila sim, :slight_smile:

para resolver o seu problema:

crie uma implementacao para DAOPrograma, ex DAOProgramaImpl

no metodo getDAOPrograma()

public DAOPrograma getDAOPrograma() throws Exception{   
        return new DAOProgramaImpl();   
    }

veja que o que vc quer retornar é uma implementação para DAOPrograma e não uma Factory, como estava fazendo.

Não tem como colocar um exemplo desse código, como disse antes estou apredendo DAO e peguei com base no código de outra pessoa.

cdorner

ta ai uma brincadeira,

esta tudo em um .java so por isso existem classes declaradas como static, leia com calma que vc entende :slight_smile:
mas deve funcionar hehe

package br.com.examples.design;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;

public class GUJ {

	public interface DAOPrograma {
		public void incluir(Programa programa) throws Exception;

	}

	public static class DAOProgramaImpl implements DAOPrograma {
		public void incluir(Programa programa) throws Exception {
			// SEU CODIGO INCLUIR
		}
	}
	
	public static class Programa {
		// wharever
	}

	abstract class DAOFactory{
		public abstract Connection createConnection() throws Exception;
	}
	
	public static class MySQLDAOFactory {
		
		private static Connection con = null;

		public Connection createConnection() throws Exception {
			if (con == null) {
				try {
					// Class.forName("org.gjt.mm.mysql.Driver");//Declaração do
					// driver
					Class.forName("com.mysql.jdbc.Driver");
					con = DriverManager.getConnection(
							"jdbc:mysql://localhost/programas", "root",
							"vertrigo");
				} catch (ClassNotFoundException e) {
					System.out.println("Classe n encontrada");
				} catch (SQLException e) {
					System.out.println("SQL exception");
				}
			}
			// se der qualquer exception acima vai retornar con nulo, 
			// é isso mesmo que vc quer? não é melhor dar um throws na exception pra tratar de outra forma pelo client?
			return con;
		}

		public DAOPrograma getDAOPrograma() throws Exception {
			return new DAOProgramaImpl();
		}

	}
}
S

Valeu, agora estou indo para faculdade, assim que chegar eu vou tentar isso e os exceptions só coloquei para ver se mostra algum coisa mesmo, n estavam no código original.

S

Eu fiz as alterações mas n está funcionando ainda, tem como eu colocar os arquivos da fonte inteira aqui no fórum?

cdorner

qual a exception?

S

Pessoal foi um erro de sintaxe de query, foi um maldito apóstrofe a mais, foi mal ae pessoal, quem quiser eu passo o código pronto, mas como estou iniciando em DAO, só inclui mas ja´alguma coisa para quem quer aprender.

Criado 30 de novembro de 2009
Ultima resposta 8 de dez. de 2009
Respostas 16
Participantes 6