Erro ao sobreescrever ArrayList! Pq?

5 respostas
C
public String listar(){
		//setRenderizador(true);
		municipio = new Municipio();
		
		try {
			municipioDAO = new MunicipioDAO();
			menuDAO = new MenuDAO();
			submenuDAO = new SubmenuDAO();
			
			municipio = (Municipio) municipioDAO.procurar(1);
			
			htmlOut += municipio.getId();
			
			List<Menu> listaMenu = new ArrayList<Menu>();
			listaMenu = (List<Menu>) menuDAO.todosPorMunic(municipio.getId());
			
			List<Submenu> listaSubmenu;
			
			for(int i = 0; i < listaMenu.size(); i++){
				
				menu = new Menu();
				
				menu = listaMenu.get(i);
				
				htmlOut += menu.getId();
				
				listaSubmenu = new ArrayList<Submenu>();
				listaSubmenu = submenuDAO.todosPorMenu(menu.getId());
				
				for(int j = 0; j < listaSubmenu.size(); j++){
					Submenu sub = new Submenu();
					sub = listaSubmenu.get(j);
					
					htmlOut += sub.getTitulo();
				}
			}
			
			System.out.println("OK "+htmlOut);
			
		} catch (DAOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
			System.out.println("erro"+e.getMessage());
		}
		
		return null;
	}

Galera tá dando erro na linha 15, o laço passa 1 vez beleza mas na segunda vez dá erro na tal linha 15! Pq??

5 Respostas

zoren

Qual o erro??

ViniGodoy

Isso não é uma sobrescrita e sim um cast. Você também pode substituir essas duas linhas:

List<Menu> listaMenu = new ArrayList<Menu>(); listaMenu = (List<Menu>) menuDAO.todosPorMunic(municipio.getId());

Por só essa aqui:

List<Menu> listaMenu = (List<Menu>) menuDAO.todosPorMunic(municipio.getId());

Não há necessidade de dar new numa lista vazia se logo em seguida você vai sobrescreve-la com o retorno do método todosPorMunic.

O cast só pode dar errado por um único motivo: O tipo retornado pelo seu Dao não é um List<Menu>. Você pode postar o código do método todosPorMunic?

Outra coisa, por que é necessário o cast? Não seria mais fácil fazer esse método retornar um List<Menu> direto?

C
public class MunicipioController {

	private Municipio municipio ;
	private MunicipioDAO municipioDAO;
	private Menu menu;
	private MenuDAO menuDAO;
	private SubmenuDAO submenuDAO;
	private boolean renderizador;
	private String htmlOut = "";
	
	public MunicipioController(){
		setRenderizador(false);
	}
	
	public String listar(){
		//setRenderizador(true);
		municipio = new Municipio();
		
		try {
			municipioDAO = new MunicipioDAO();
			menuDAO = new MenuDAO();
			submenuDAO = new SubmenuDAO();
			
			municipio = (Municipio) municipioDAO.procurar(1);
			
			htmlOut += municipio.getId();
			
			List<Menu> listaMenu = new ArrayList<Menu>();
			listaMenu = (List<Menu>) menuDAO.todosPorMunic(municipio.getId());
			
			
			for(int i = 0; i < listaMenu.size(); i++){
				
				menu = new Menu();
				
				menu = listaMenu.get(i);
				
				htmlOut += menu.getId();
				
				List<Submenu> listaSubmenu = submenuDAO.todosPorMenu(menu.getId());
				
				for(int j = 0; j < listaSubmenu.size(); j++){
					Submenu sub = new Submenu();
					sub = listaSubmenu.get(j);
					
					htmlOut += sub.getTitulo();
					System.out.println(sub.getTitulo());
				}
			}
			
			System.out.println("OK "+htmlOut);
			
		} catch (DAOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
			System.out.println("erro"+e.getMessage());
		}
		
		return null;
	}

	public List<Municipio> getMunicipios(){
		try {
			municipioDAO = new MunicipioDAO();
			return (List<Municipio>) municipioDAO.todos();
		} catch (DAOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		return null;		
	}
	public void setMunicipio(Municipio municipio) {
		this.municipio = municipio;
	}


	public Municipio getMunicipio() {
		return municipio;
	}


	public void setRenderizador(boolean renderizador) {
		this.renderizador = renderizador;
	}


	public boolean isRenderizador() {
		return renderizador;
	}

	public void setHtmlOut(String htmlOut) {
		this.htmlOut = htmlOut;
	}

	public String getHtmlOut() {
		return htmlOut;
	}

	public void setMenu(Menu menu) {
		this.menu = menu;
	}

	public Menu getMenu() {
		return menu;
	}

	public void setMenuDAO(MenuDAO menuDAO) {
		this.menuDAO = menuDAO;
	}

	public MenuDAO getMenuDAO() {
		return menuDAO;
	}
}

parte do SubmenuDAO

public List<Submenu> todosPorMenu(int menuid) throws DAOException {
		// TODO Auto-generated method stub
		
		PreparedStatement ps = null;
        Connection conn = null;
        ResultSet rs = null;

        try {
            conn = this.conn;
            ps = conn.prepareStatement("select titulo from submenu where menu ="+ menuid);
            rs = ps.executeQuery();
            
            List<Submenu> list = new ArrayList<Submenu>();
            
            while (rs.next()) {
            	
                Submenu submenu = new Submenu();

                submenu.setTitulo(rs.getString(1));
                
                list.add(submenu);

            }
            return list;

        } catch (SQLException sqle) {
        	sqle.printStackTrace();
            throw new DAOException(sqle);
        } finally {
            ConnectionFactory.closeConnection(conn, ps, rs);
        }
	}
Erro:

Caused by: org.postgresql.util.PSQLException: Um erro de E/S ocorreu ao enviar para o processo servidor.

at org.postgresql.core.v3.QueryExecutorImpl.execute(QueryExecutorImpl.java:220)

at org.postgresql.jdbc2.AbstractJdbc2Statement.execute(AbstractJdbc2Statement.java:451)

at org.postgresql.jdbc2.AbstractJdbc2Statement.executeWithFlags(AbstractJdbc2Statement.java:350)

at org.postgresql.jdbc2.AbstractJdbc2Statement.executeQuery(AbstractJdbc2Statement.java:254)

at idesp.sie.dao.SubmenuDAO.todosPorMenu(SubmenuDAO.java:190)

 38 more

Caused by: java.io.IOException: Stream closed

at sun.nio.cs.StreamEncoder.ensureOpen(Unknown Source)

at sun.nio.cs.StreamEncoder.flush(Unknown Source)

at java.io.OutputStreamWriter.flush(Unknown Source)

at org.postgresql.core.PGStream.flush(PGStream.java:507)

at org.postgresql.core.v3.QueryExecutorImpl.sendSync(QueryExecutorImpl.java:692)

at org.postgresql.core.v3.QueryExecutorImpl.execute(QueryExecutorImpl.java:193)

 42 more

erroorg.postgresql.util.PSQLException: Um erro de E/S ocorreu ao enviar para o processo servidor.
maior_abandonado

vamos por partes.

Caused by: org.postgresql.util.PSQLException: Um erro de E/S ocorreu ao enviar para o processo servidor. at org.postgresql.core.v3.QueryExecutorImpl.execute(QueryExecutorImpl.java:220) at org.postgresql.jdbc2.AbstractJdbc2Statement.execute(AbstractJdbc2Statement.java:451) at org.postgresql.jdbc2.AbstractJdbc2Statement.executeWithFlags(AbstractJdbc2Statement.java:350) at org.postgresql.jdbc2.AbstractJdbc2Statement.executeQuery(AbstractJdbc2Statement.java:254) at idesp.sie.dao.SubmenuDAO.todosPorMenu(SubmenuDAO.java:190) ... 38 more Caused by: java.io.IOException: Stream closed at sun.nio.cs.StreamEncoder.ensureOpen(Unknown Source) at sun.nio.cs.StreamEncoder.flush(Unknown Source) at java.io.OutputStreamWriter.flush(Unknown Source) at org.postgresql.core.PGStream.flush(PGStream.java:507) at org.postgresql.core.v3.QueryExecutorImpl.sendSync(QueryExecutorImpl.java:692) at org.postgresql.core.v3.QueryExecutorImpl.execute(QueryExecutorImpl.java:193) ... 42 more erroorg.postgresql.util.PSQLException: Um erro de E/S ocorreu ao enviar para o processo servidor.

aparentemente o erro não é necessariamente com o cast, mais dede E/S, tenta conecta e fazer um select simples, e chama esse metodo de teste no lugar onde chama o submenuDAO.todosPorMenu, sem esses casts todos pra ver se da certo ou se da alguma exception. (apesar que pelo stacktrace eu tenho um chute meio no escuro de que a connection no seu dao estava fechada, vc teve algum problema de rede impedindo a conexão, ou algo do tipo)

quando vc tem uma classe generica, com o tipo, como no caso de List<Tipo>, herança não ajuda muito no caso do tipo, eu não tenho certeza se funciona, não seria melhor deixar +- como abaixo:

...
            List<Submenu> listaMenu = menuDAO.todosPorMunic(municipio.getId());   
               
               
            for(int i = 0; i < listaMenu.size(); i++){   
                   
                menu = listaMenu.get(i);//se for o caso force o cast aqui 
    ...

não tenho certeza se isso ja resolve completamente mais ao menos ja é um caminho...

qual a linha 15 que vc falou? no códigoq ue vc mostro a decima quinta linha esta em branco... e fora do laço

C

Galera valeu pela ajuda!!

Maior_Abandonado teu tiro foi certo, antes de ler o forum novamente percebi que só instanciava uma vez o DAO do submenu, e logo que ele fazia o select ele fechava a conexão, ai qd ele tentava o segundo select dava de “cara na porta”!!!

Criado 15 de setembro de 2009
Ultima resposta 16 de set. de 2009
Respostas 5
Participantes 4