Solucionado (ver solução)
Solucionado
(ver solução)
2
respostas

Tentativa com forEach

Eu tentei fazer com o forEach mas estou recebendo NullPointer. Não entendi bem por que isso aconteceu. Segundo o instrutor, o forEach eliminaria o problema do NullPointer por não acessar uma posição sem referência.

Classe Funcionario:

package aprendizadojavaalura;

public class Funcionario {

    String nome;
    String departamento;
    double salario;
    Data dataEntrada;
    String rg;

    void recebeAumento(double salario){
        this.salario += salario;
    }

    double calculoGanhoAnual(){
        return this.salario * 12;
    }

    void mostrarInfoFuncionario(){
        System.out.println("Nome Funcionário: "+this.nome);
        System.out.println("Departamento: "+this.departamento);
        System.out.println("Salário (R$) "+this.salario);
        System.out.println("RG: "+this.rg);
        System.out.println("Data de Entrada: "+ this.dataEntrada.getFormatada());
    }

}

Classe Empresa :


package aprendizadojavaalura;

public class Empresa {
    String nome;
    String cnpj;
    Funcionario[] empregados;
    int livre = 0;


    void adicionar(Funcionario f){

        // Coloca a referência do objeto Funcionario dentro do array de Funcionarios na posição livre (que começa com 0)
        this.empregados[this.livre] = f;

        //Coloca um contador para mudar a posição do Array, para não sobrescrever o Funcionário na posição anterior.
        this.livre++;
    }

    void mostrarSalarioFuncionarios(){
        for(Funcionario funcionario : this.empregados){
            System.out.println("Nome Funcionário: "+funcionario.nome);
            System.out.println("Salário (R$): "+funcionario.salario);
        }
    }
}

Classe Main

package aprendizadojavaalura;

public class BalancoTrimestral {

    public static void main(String[] args) {

        Funcionario f1 = new Funcionario();
        f1.nome = "Leonardo Lopes";
        f1.departamento = "T.I";
        f1.rg = "41.439.370-3";
        f1.salario = 10000;

        f1.dataEntrada = new Data();
        f1.dataEntrada.montarData(10, 11, 2011);

        Funcionario f2 = new Funcionario();

        f2.nome = "Lucas Souza";
        f2.departamento = "Comércio";
        f2.rg = "23.421.370-3";
        f2.salario = 2000;

        f2.dataEntrada = new Data();
        f2.dataEntrada.montarData(10, 11, 2011);

        Empresa empresa = new Empresa();
        empresa.empregados = new Funcionario[10];
        empresa.adicionar(f1);
        empresa.adicionar(f2);

        empresa.mostrarSalarioFuncionarios();

    }
}
2 respostas
solução!

Olá léo, como você pode perceber, na linha onde contém

empresa.empregados = new Funcionario[10];

é criado um array de 10 posições que podem armazenar funcionários, ele cria 10 referencias a funcionário. Ao fazer o forEach, o java entende que lá contem 10 referencias a funcionário e tenta imprimir na tela os 10.

Eu mudei o seu metodo mostrarSalarioFuncionarios() só pra voce entender um pouco mais. Em vez de imprimir um atributo da classe, imprime o toString do objeto Funcionario

        for (Funcionario funcionario : this.empregados) {
            System.out.println(funcionario);
//            System.out.println("Nome Funcionário: " + funcionario.nome);
//            System.out.println("Salário (R$): " + funcionario.salario);
        }

E o resultado foi:

solucoes.Funcionario@70dea4e
solucoes.Funcionario@5c647e05
null
null
null
null
null
null
null
null

Mesmo as 8 referencias não apontando para nenhum objeto (null), elas estão ali e são consideradas.

Esse é um problema corriqueiro ao utilizar array bruto, mais para frente serão apresentadas as coleções para você!

Bons estudos

Abraços :)

Desculpa a demora Gustavo. Eu entendi. Pelo fato de eu estar criando um array de posição 10, não signfica que ele vai percorrer sói os arrays que possuem referência pra outro objeto. Eu tenho já conheço Java e dificilmente uso arrays comuns. ArrayList salva vidas hahaha. Eu achei que fazer forEach ia percorrer só os objetos que tinham referência e ia ignorar as referências "null"