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

Dúvida no Ex. 6 da Aula 4 - Arrays

Exception in thread "main" java.lang.NullPointerException at Funcionarios.Empresa.mostraTodasInformacoes(MainFuncionarios.java:41) at Funcionarios.TestaEmpresa.main(MainFuncionarios.java:103)

Esse erro persiste em acontecer, porém não acho o motivo dele.

Segue meu codigo:

class Funcionario{

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

    void recebeAumento(double Aumento){
        this.salario += Aumento;
    }
    double calcularGanhoAnual(){
        return this.salario * 12;
    }
    void mostra(){
        System.out.println("nome: " + this.nome);
        System.out.println("departamento: " + this.departamento);
        System.out.println("salario: " + this.salario);
        System.out.println("data de entrada: " + this.dataDeEntrada.getFormata());
        System.out.println("rg: " + this.rg);
        System.out.println("calculo anual: " + this.calcularGanhoAnual());
    }
}

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

    void adiciona(Funcionario f) {
        this.empregados[this.livre] = f;
        this.livre++;
    }
    void mostraTodasInformacoes(){    
        for(int x = 0; x < this.empregados.length; x++){
            System.out.println("Funcionarios na posicao: " + x);
            this.empregados[x].mostra();
        }
    }
    boolean contem(Funcionario f) {
        for (int z = 0; z < this.livre; z++) {
            if (f == this.empregados[z]) {
                return true;
            }
        }
        return false;
    }
}
class Data{

    int dia;
    int mes;
    int ano;

    String getFormata(){
        return this.dia + "/" + this.mes + "/" + this.ano;
    }

    void preencheData(int dia, int mes, int ano){

        this.dia = dia;
        this.mes = mes;
        this.ano = ano;
    }
}
//USANDO ARRAYS

class TestaEmpresa{
    public static void main(String[] args){

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


        empresa.empregados[0] = new Funcionario();
        empresa.empregados[0].nome = "andre montorio";
        empresa.empregados[0].departamento = "desenvolvedor";
        //empresa.empregados[0].dataDeEntrada.preencheData(26, 04, 1995);
        empresa.empregados[0].rg = "521841842";
        empresa.empregados[0].salario = 5000.0;

        empresa.empregados[0].dataDeEntrada = new Data();
        empresa.adiciona(empresa.empregados[0]);

        //OU POSSO FAZER ASSIM

        Funcionario f1 = new Funcionario();
        f1.salario = 1000.0;
        f1.nome = "andrezim";
        f1.departamento = "desenvolvedor 2";
        f1.rg = "1111111111111";

        f1.dataDeEntrada = new Data();
        //f1.dataDeEntrada.preencheData(06, 02, 1990);
        empresa.adiciona(f1);

        //empresa.empregados[0].mostra();
        //empresa.empregados[1].mostra();

        empresa.mostraTodasInformacoes();


        }
    }

Também tenho dúvida na parte "f1.dataDeEntrada = new Data" . Qual a necessidade? E porque quando eu tento adicionar uma data usando: f1.dataDeEntrada.preencheData(06, 02, 1990); ou empresa.empregados[0].dataDeEntrada.preencheData(26, 04, 1995); Aparece erro.

4 respostas
solução!

Oi Andre,

O NullPointerException está acontecendo porque na hora de você criar o array de funcionarios da empresa, você está o criando com tamanho 10:

empresa.empregados = new Funcionario[10];

Mas somente adicionou 1 funcionario no array:

empresa.adiciona(empresa.empregados[0]);

E quando você chama o método mostraTodasInformacoes:

empresa.mostraTodasInformacoes();

Esse método percorre todas as posições do array(da posição 0 até a posição 9) mas o seu array só tem 1 funcionário, ai quando o loop chega na segunda posição vem null e dá a exception:

for(int x = 0; x < this.empregados.length; x++){
    System.out.println("Funcionarios na posicao: " + x);
    this.empregados[x].mostra();
}

O atributo length do array vai devolver 10, porque ele guarda o tamanho total do array e não o número de elementos dentro dele.

Pra parar de dar o erro, você deve mudar o tamanho do array para 1:

empresa.empregados = new Funcionario[1];

Ou então no loop do método mostraTodasInformacoes, percorrer apenas o número de elementos preenchidos, e dá pra fazer isso usando o atributo livre da classe empresa, pois esse atributo está guardando exatamente a quantidade de funcionários que foi adicionado ao array:

for(int x = 0; x < livre; x++){
    System.out.println("Funcionarios na posicao: " + x);
    this.empregados[x].mostra();
}

Bons estudos!

Obrigado Rodrigo!!! Ótima explicação ! Também tenho dúvida na parte "f1.dataDeEntrada = new Data". Qual a necessidade? E porque quando eu tento adicionar uma data usando: f1.dataDeEntrada.preencheData(06, 02, 1990); ou empresa.empregados[0].dataDeEntrada.preencheData(26, 04, 1995); Aparece erro.

Oi André,

Dentro da sua classe Funcionario tem o atributo dataDeEntrada, e esse atributo é do tipo Data, que é uma outra classe sua.

Para preencher a data do funcionario, você primeiramente deve instanciar um objeto do tipo Data:

f1.dataDeEntrada = new Data();

Agora sim, dentro do funcionario f1 o atributo dataDeEntrada já está instanciado, e sendo assim agora você já pode acessá-lo e chamar o método preencheData:

f1.dataDeEntrada.preencheData(06, 02, 1990);

Ou seja, como o atributo dataDeEntrada é um classe, primeiro você deve instancia-lo, para depois poder chamar o método preencheData. Caso contrario vai acontecer um NullPointerException, pois estaria tentando chamar o método preencheData de um objeto nulo.

Bons estudo!

Obrigado Rodrigo!!