8
respostas

Dúvida Arrays e loop

Olá, possuo uma dúvida: Por que o código 1 funciona corretamente, mostrando os funcionários cadastrados no array, enquanto o código 2 não mostra?

Código 1

for(int i=0; i<this.func.length;i++){
            Funcionario funcAux = this.func[i];
            if(funcAux == null){
                this.func[i] = new Funcionario();
                this.func[i].nome = nome;
                this.func[i].departamento = departamento;
                this.func[i].salario = salario;
                this.func[i].dataEntrada = new Data();
                if(data != null){
                    this.func[i].dataEntrada.dia = data.dia;
                    this.func[i].dataEntrada.mes = data.mes;
                    this.func[i].dataEntrada.ano = data.ano;
                }
                this.func[i].rg = rg;
                break;
            }
        }

Código 2

for(Funcionario nFunc : func){
            if(nFunc == null){
                nFunc = new Funcionario();
                nFunc.nome = nome;
                nFunc.departamento = departamento;
                nFunc.salario = salario;
                nFunc.dataEntrada = new Data();
                if(data != null){
                    nFunc.dataEntrada.dia = data.dia;
                    nFunc.dataEntrada.mes = data.mes;
                    nFunc.dataEntrada.ano = data.ano;
                }
                nFunc.rg = rg;
                break;
            }
        }
8 respostas

Ola LUCAS BARRETO !

Esta executando esses dois for na sequencia dentro do mesmo main ?

Poderia postar o código exatamente como vc esta executando ?

Abraço!

Oi Lucas Barreto! No código 2 o nFunc nunca será null. O código o Java coloca dentro do nFunc o item da lista da iteração atual, se não tiver item o for sai direto para a continuação do programa. Ou seja o bloco dentro do f(nFunc == null) não será executado.

Bruno!

Depende como ele executar.

Se ele executar somente o 2º loop, vai estar null sim. Porém se ele executar o 1º loop e na sequencia o 2º loop , aí nesse caso, vai acontecer como voce falou!

Oi Cristiano! Você esta certo. Temos duas situações... Se a lista iterada no for estiver vazia vai acontecer como falei, porém, se ela possui um Funcionario null (null mesmo) em uma de suas posições o if é atendido.

Códigozinho simples e maroto esse rs......

Então , para tornar a pergunta mais completa o raciocício é o seguinte:

Adiciona ao array de Funcionarios da classe Empresa utilizando o Código 1 ou o Código 2. Para imprimir os funcionários da empresa é utilizados este método

    void mostraFuncEmpresa(){
            for(Funcionario nFunc : this.func){
                Funcionario funcAux = nFunc;
                if(funcAux == null)continue;
                nFunc.mostra();
            }
    }

Função que imprime o funcionário na Classe Funcionario

void mostra(){
        System.out.println("\nNome Funcionario: "+this.nome+"\n"+
                   "Salario: "+this.salario+"\n"+
                   "Departamento: "+this.departamento+"\n"+
                   "RG: "+this.rg);
        if(this.dataEntrada == null){
            System.out.println("Data não cadastrada");
        } else {
            this.dataEntrada.mostraData();
            System.out.println("Data formatada: "+this.dataEntrada.getDataFormatada());
        }
    }

O lance é que quando eu utilizo o Código 2 para preencher o array de funcionários da Classe Empresa, o método não imprime nada. Por que?

Ah e a chamada na main é a seguinte:

        Empresa emp = new Empresa();
        emp.setCnpj("1234567890123");
        emp.setNome("Zen");
        emp.adicionaFuncEmpresa(func.getFuncNome(), func.getFuncDepartamento(), func.getFuncSalario(), func.getFuncData(), func.getFuncRg());
        emp.adicionaFuncEmpresa(f2.getFuncNome(), f2.getFuncDepartamento(), f2.getFuncSalario(), f2.getFuncData(), f2.getFuncRg());
        emp.adicionaFuncEmpresa(f3);
        emp.mostraFuncEmpresa();

Oi Lucas! Então... Acho que já tenho uma idéia.

No código 1 onde você você esta modificando a posição exata no array (nFunc[i]) ou seja você mudou o apontamento dessa posição para um objeto novo e o null foi esquecido.

No código 2 o fluxo é diferente, pois você tem a variável nFunc que aponta para o mesma posição de memória da variável da posição iterada. Quando você faz nFunc = new Funcionario você esta apenas mudando o apontamento de nFunc, a posição do array continua apontando para null.

Tem coisas que a segundo estilo de for não é aconselhável.

Entendeu o pulo do gato?

Quer mergulhar em tecnologia e aprendizagem?

Receba a newsletter que o nosso CEO escreve pessoalmente, com insights do mercado de trabalho, ciência e desenvolvimento de software