[RESOLVIDO] - For rodando duas vezes quando ele é chamado apenas uma

Gente, boa!

Está acontecendo um mistério cabeludo que não tô conseguindo entender o pq isso tá acontecendo.

Tenho a Classe Professor com Métodos (Ambos retornando uma String):

public class Professor{
    public String imprimeProfDiscs(Context context){
        System.out.println("j");
        banco = new BancoDeDados(context);// INSTÂNCIAS DO BANCO DE DADOS
        dadosPessoais = banco.consultarDadosPessoaisPeloCpfBanco(getFkDadosPessoais());// CONSULTA DO DadosPessoais SEGUNDOA FK DO PROFESSOR QUE É O CPF DO DadosPessoais
        endereco = banco.consultarEnderecoPeloIdBanco(getFkEndereco());// CONSULTA DO Endereco

        if(dadosPessoais == null){
            return "CONTA EXCLUÍDA\n\nREMOVA ELA DA LISTA!";
        }
        else{
            if(endereco == null){
                return dadosPessoais.imprimeDadosPessoais() + "\n\nSEM ENDEREÇO CADASTRADO.\nFAVOR ATUALIZAR OS DADOS DO PROFESSOR!";
            }
            else{
                if(disciplinas(context) == null){
                    return dadosPessoais.imprimeDadosPessoais() + "\n\n" + endereco.imprimeEndereco() + "\n\nSEM DISCIPLINA CADASTRADA.\nFAVOR ATUALIZAR OS DADOS DO PROFESSOR!";
                }
                else{
                    return dadosPessoais.imprimeDadosPessoais() + "\n\n" + endereco.imprimeEndereco() + "\n\nDISCIPLINAS:\n" + disciplinas(context);
                }
            }
        }
    }

    /**
     <MÉTODO QUE LISTA AS DISCIPLINAS QUE ESTE PROFESSOR MINISTRA
     */
    public String disciplinas(Context context){
        System.out.println("k");
        banco = new BancoDeDados(context);// INSTÂNCIAS DO BANCO DE DADOS
        StringBuilder stringBuilder = new StringBuilder();// INSTÂNCIA DO StringBuilder
        ArrayList<RelacionalProfDisc> arrayListRelacionalProfDisc = new ArrayList<>();// INSTÂNCIA DO ArrayList DE arrayListarrayListRelacionalProfDisc

        Cursor resultado = banco.listarRelacionalProfDiscBanco();// lISTA DE TODAS AS RELACIONAIS ENTRE O PROFESSOR E A DISCIPLINA

        // SE O getCount() FOR IGUAL A 0, É POR QUE A LISTA ESTÁ VAZIA. ENTÃO O MÉTOOD disciplinas() RETORNA null
        if(resultado.getCount() == 0){
            return nomeDiscConcat = null;// A LISTA ESTÁ VAZIA
        }
        else{
            while(resultado.moveToNext()){
                String idInterProfDisc = resultado.getString(resultado.getColumnIndex("ID_RELACIONAL_PROF_DISC"));
                String fkProf = resultado.getString(resultado.getColumnIndex("FK_RELACIONAL_PROF"));
                String fkDisc = resultado.getString(resultado.getColumnIndex("FK_RELACIONAL_DISC"));

                relacionalProfDisc = new RelacionalProfDisc(idInterProfDisc, fkProf, fkDisc);// INSTÂNCIA DO InterProfDisc
                arrayListRelacionalProfDisc.add(relacionalProfDisc);// INSERÇÃO DO InterProfDisc NO ARRAYLISTA arrayListInterProfDisc
            }

            int cont = 1;// Contador de Disciplinas. Ele tem que ser declarado fora do for e implementado dentro do if do for

            /**<O ARRAYLIST arrayListRelacionalProfDisc É VARRIDO E EM CADA RODADA QUE O for DÁ, LHE É ATRIBUÍDO UM relacionalProfDisc SEGUNDO O ÍNDICE i*/
            for(int i = 0; i < arrayListRelacionalProfDisc.size(); i++){
                relacionalProfDisc = arrayListRelacionalProfDisc.get(i);

                if(relacionalProfDisc.getFkProfessor().equals(getIdProfessor())){
                    disciplina = banco.consultarDisciplinaPeloIdBanco(relacionalProfDisc.getFkDisciplina());
                    stringBuilder.append(cont + " - " + disciplina.getNomeDisciplina() + "\n");// stringBuilder EMPILHA OS VALORES: cont QUE CONTA QUANTAS VEZES O for É RODADO, UM TRAÇO "-", O NOME DA DISCIPLINA E UM \n QUE É A PRÓXIMA LINHA
                    nomeDiscConcat = stringBuilder.toString();// A VARIÁVEL nomeDiscConcat RECEBE O VALOR QUE ESTÁ EM stringBuilder CONCATENADO NUMA STRING
                    cont++;// Incremento do Contador de Disciplinas. A cada giro do for ele é incrementado, recebendo a soma de +1

                    System.out.println("cont++:::::"+cont);
                    System.out.println("w:::"+disciplina.getNomeDisciplina());
                }
                else{
                    System.out.println("y:::"+disciplina.getNomeDisciplina());
                }
            }
            System.out.println("z");
        }
        return nomeDiscConcat;
    }
}

O método disciplinas(Context context) é chamado dentro do método imprimeProfDiscs(Context context)

Em outra classe, professorConsultado(), chamo o método imprimeProfDiscs(Context context) para que seu resultado seja exibido no TextView tvDadosCadastrais.setText(professor.imprimeProfDiscs(ProfessorConsultAtualRemo.this))

O resultado que tenho nos System.out.println são esses:

I/System.out: j
I/System.out: k
I/System.out: cont++:::::2
I/System.out:  w:::11111
I/System.out: cont++:::::3
I/System.out: w:::33333
I/System.out: cont++:::::4
I/System.out: w:::55555
I/System.out: cont++:::::5
I/System.out:  w:::77777
I/System.out: cont++:::::6
I/System.out:  w:::99999
I/System.out: z
I/System.out: k
I/System.out: cont++:::::2
I/System.out: w:::11111
I/System.out: cont++:::::3
I/System.out: w:::33333
I/System.out: cont++:::::4
I/System.out:  w:::55555
I/System.out: cont++:::::5
I/System.out: w:::77777
I/System.out: cont++:::::6
I/System.out: w:::99999
I/System.out:  z

Não sei por que ele tá rodando o for duas vezes!
Ele roda o j uma vez, quando o método imprimeProfDiscs(Context context) é chamado, mas roda duas vezes no método disciplinas(Context context), sendo que não tem nada que faz o for rodar duas vezes, pelo menos não estou vendo.

Alguém?

Obg!

Faz isso

for(int i = 0; i <= arrayListRelacionalProfDisc.size();

Nossa, desculpa, eu tava com sono essa hora kkkkkkk

Não precisa trocar não, o for ta sendo chamado conforme o tamanho da lista:

for(int i = 0; i < arrayListRelacionalProfDisc.size(); i++){...}

Verifica o lenght da sua lista pra ter ctz do que está acontecendo

Falta de atenção, veja os comentários no código abaixo:

public String imprimeProfDiscs(Context context){
    System.out.println("j");
    banco = new BancoDeDados(context);
    dadosPessoais = banco.consultarDadosPessoaisPeloCpfBanco(getFkDadosPessoais());
    endereco = banco.consultarEnderecoPeloIdBanco(getFkEndereco());

    if(dadosPessoais == null){
        return "CONTA EXCLUÍDA\n\nREMOVA ELA DA LISTA!";
    } 
    else{
        if(endereco == null){
            return dadosPessoais.imprimeDadosPessoais() + "\n\nSEM ENDEREÇO CADASTRADO.\nFAVOR ATUALIZAR OS DADOS DO PROFESSOR!";
        }
        else{
            // na linha abaixo você chama o disciplinas(context) a primeira vez
            if(disciplinas(context) == null){
                return dadosPessoais.imprimeDadosPessoais() + "\n\n" + endereco.imprimeEndereco() + "\n\nSEM DISCIPLINA CADASTRADA.\nFAVOR ATUALIZAR OS DADOS DO PROFESSOR!";
            }
            else{
                // na linha abaixo você chama o disciplinas(context) a segunda vez
                return dadosPessoais.imprimeDadosPessoais() + "\n\n" + endereco.imprimeEndereco() + "\n\nDISCIPLINAS:\n" + disciplinas(context);
            }
        }
    }
}

Dica, quando você chama métodos que retornam valores, procure chamá-los apenas uma vez e armazenar o resultado em variáveis locais.

Exemplo:

public String imprimeProfDiscs(Context context){
    System.out.println("j");
    banco = new BancoDeDados(context);
    dadosPessoais = banco.consultarDadosPessoaisPeloCpfBanco(getFkDadosPessoais());
    endereco = banco.consultarEnderecoPeloIdBanco(getFkEndereco());

    if(dadosPessoais == null){
        return "CONTA EXCLUÍDA\n\nREMOVA ELA DA LISTA!";
    } 
    else{
        String dadosPessoaisImpressos = dadosPessoais.imprimeDadosPessoais();
        if(endereco == null){
            return dadosPessoaisImpressos + "\n\nSEM ENDEREÇO CADASTRADO.\nFAVOR ATUALIZAR OS DADOS DO PROFESSOR!";
        }
        else{
            String enderecoImpresso = endereco.imprimeEndereco();
            String disciplinasImpressas = disciplinas(context);
            if(disciplinasImpressas == null){
                return dadosPessoaisImpressos + "\n\n" + enderecoImpresso + "\n\nSEM DISCIPLINA CADASTRADA.\nFAVOR ATUALIZAR OS DADOS DO PROFESSOR!";
            }
            else{
                return dadosPessoaisImpressos + "\n\n" + enderecoImpresso + "\n\nDISCIPLINAS:\n" + disciplinasImpressas;
            }
        }
    }
}
1 curtida

Não é isso. É o que @staroski falou.

Vi o retorno do método em dois lugares: Na Activity e no sout. Na Activity ele só exibia 1x e no sout ele tava mostrando 2x, por isso que eu não entendi.

Muito sutil! só em chamar o método, MESMO QUE ELE ESTEJA NUM PARÂMETRO, ele já exibe seu retorno no sout. Na activity não, mas no sout sim.

Então fiz o seguinte, alterei o método colocando as linhas:

System.out.println("primeiro");
System.out.println("segundo");

O retorno ficou assim:

I/System.out: j
I/System.out: k
I/System.out: cont++:::::2
I/System.out: w:::PORTUGUÊS
I/System.out: cont++:::::3
I/System.out: w:::MATEMÁTICA
I/System.out: cont++:::::4
I/System.out: w:::FÍSICA
I/System.out: cont++:::::5
I/System.out: w:::QUÍMICA
I/System.out: cont++:::::6
I/System.out: w:::BIOLOGIA
I/System.out: z
I/System.out: segundo
I/System.out: k
I/System.out: cont++:::::2
I/System.out: w:::PORTUGUÊS
I/System.out: cont++:::::3
I/System.out: w:::MATEMÁTICA
I/System.out: cont++:::::4
I/System.out: w:::FÍSICA
I/System.out: cont++:::::5
I/System.out: w:::QUÍMICA
I/System.out: cont++:::::6
I/System.out: w:::BIOLOGIA
I/System.out: z

Ele NÃO imprime o "primeiro", ele exibe o retorno, MAS SEM ENTRAR NO if(disciplinas(context) == null). E mesmo assim ele exibiu no sout, diga aí…

Perfeito. Fiz como vc falou e o controle de fluxo nem se compara, bem melhor fazer assim. Obg!