Loop Infinito

5 respostas
ricardocomp

Olá pessoal,
eu estou com um problema de um loop infinito aqui
que não estou conseguindo resolver será que alguém pode me dar uma
ajuda, fazendo o favor?

public SolicitacaoServico procurarSolicitacaoServico(int protocolo) throws LAFQADaoException {
...
int idProdutor = rs.getInt(2);
            int idTecnico = rs.getInt(3);
            String nome = rs.getString(4);
            String data = rs.getString(5);
            String hora = rs.getString(6);
            int numero_amostra = rs.getInt(7);

            ProdutorDao produtorDao = new ProdutorDao(conn);
            Produtor produtor = produtorDao.procurarProdutor(idProdutor);

            TecnicoDao tecnicoDao = new TecnicoDao(conn);
            Tecnico tecnico = tecnicoDao.procurarTecnico(idTecnico);

            AmostraDao amostraDao = new AmostraDao(conn);
            //Nessa linha que começa o Loop Inifinito
            List<Amostra> amostras = amostraDao.procurarAmostrasPorProtocolo(protocolo);

            return new SolicitacaoServico(protocolo, produtor, tecnico, nome, data, hora, numero_amostra, amostras);
}
public List<Amostra> procurarAmostrasPorProtocolo(int protocolo) throws LAFQADaoException{
...
while (rs.next()) {

                int idAmostra = rs.getInt(1);
                int prot = rs.getInt(2);
                String marca = rs.getString(3);
                String lote = rs.getString(4);

                String tpAmostra =  rs.getString(5);
                TipoAmostra tipoAmostra = Enum.valueOf(TipoAmostra.class, tpAmostra.toUpperCase());
                
                String tpBebida = rs.getString(6);
                TipoBebida tipoBebida = Enum.valueOf(TipoBebida.class, tpBebida.toUpperCase());

                SolicitacaoServicoDao solicitacaoDao = new SolicitacaoServicoDao(conn);
                //Chama o método lá de cima e cai no Loop Infinito.
                SolicitacaoServico solicitacao = solicitacaoDao.procurarSolicitacaoServico(protocolo);
                
                list.add(new Amostra(idAmostra, solicitacao, marca, lote, tipoAmostra, tipoBebida));
            }

            return list;
}

Será que alguém pode me dar uma ajuda?

[]'s.

5 Respostas

eduveks

Não é loop infinito… e sim recursividade infinita, por que o teu loop, no caso o while (rs.next()), isto tem fim, e vai para quando chegar ao fim do rs.

Recursividade é quanto tens o método A que chama o método B, e o método B volta a chamar o método A, que por sua vês como é óbvio chama o método B, e assim por diante.

Repare q no teu caso vc tem:

Em SolicitacaoServico.procurarSolicitacaoServico:
:arrow: List<Amostra> amostras = amostraDao.procurarAmostrasPorProtocolo(protocolo);

E em Amostra.procurarAmostrasPorProtocolo
:arrow: SolicitacaoServico solicitacao = solicitacaoDao.procurarSolicitacaoServico(protocolo);

E isto esta sempre a retornar novas instâncias pelo que percebi… o que provavelmente recarrega o ResultSet, e volta o que faz ficar em recursividade infinita, pois o ResultSet provavelmente é sempre carregado da mesma forma.

Sendo assim não sei por onde esta a começar a execução, mas para você conseguir ver melhor o comportamento, coloque um System.out.println(…) a imprimir uma indicação do ponto onde esta o comando para saber por onde ele esta passando, e ver como ele esta executando, e assim você vai conseguir compreender o comportamento e pensar como resolver.

slompo

Um método comum de simplificação é dividir o problema em subproblemas do mesmo tipo. Como técnica de programação, este método é conhecido como dividir e conquistar e é a chave para a construção de muitos algoritmos importantes, bem como uma parte fundamental da programação dinâmica.

função fatorial(n) 
{
  se (n <= 1)
    retorne 1;
  senão
    retorne n * fatorial(n-1);
}

estabeleça um fim para a recursividade que ficara tudo bem =D

ricardocomp

Jóia eduveks?

Eu preciso passar uma lista de Amostras para o construtor da classe SolicitacaoServico

public SolicitacaoServico procurarSolicitacaoServico(int protocolo) throws LAFQADaoException {
...
    AmostraDao amostraDao = new AmostraDao(conn);
    List<Amostra> listaAmostras = amostraDao.procurarAmostrasPorProtocolo(protocolo);

    return new SolicitacaoServico(protocolo, produtor, tecnico, nome, data, hora, numero_amostra, listaAmostras);
}

Só que para eu passar essa lista para esse construtor eu não tenho a solicitação pronta
ainda e quando eu chamo o método procurarAmostrasPorProtocolo(protocolo) ele precisa de
uma solicitação que ainda não esta pronta aí fica um método chamando um ao outro e por isso
ocorre uma recursividade infinita

public List<Amostra> procurarAmostrasPorProtocolo(int protocolo) throws LAFQADaoException{
    ...
    SolicitacaoServicoDao solicitacaoDao = new SolicitacaoServicoDao(conn);
    SolicitacaoServico solicitacao = solicitacaoDao.procurarSolicitacaoServico(protocolo);
               
    list.add(new Amostra(idAmostra, solicitacao, marca, lote, tipoAmostra, tipoBebida));
}

Será que tem como você eduveks ou alguém me dar uma ajuda?

[]'s.

eduveks

Você esta implementando errado a lógica! Certamente há maneira melhor de fazer.

Portanto, faça um debug ou System.out.println, e procure uma forma melhor de fazer evitando esta situação.

Mais que isto não posso fazer e penso que mais ninguém, tens q analisar e procurar uma forma melhor.

slompo

Utilizas Diagramas de UML? eles facilitam o entendidmento da relação entre metodos e classes, vale a pena monta-los pois o programador pode ter uma visão maior dos fatos :wink:

Criado 13 de janeiro de 2010
Ultima resposta 13 de jan. de 2010
Respostas 5
Participantes 3