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

java.lang.NullPointerException

Olá alguém poderia me ajudar na resolução desse exercício, estou adicionando as 3 classes que eu utilizo, ao tentar chamar o método mostrarDadosFuncionarios que seria pra mostrar dados do array funcionário que pertence a classe Empresa ela emite um NullpointerException .

public class Funcionario {
    String nome;
    String departamento;
    double salario;
    Data data;
    String rg;
    boolean estaNaEmpresa;
    Empresa empresa;

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

    double calculaGanhoAnual(){
        double ganhoAnual;
        ganhoAnual = (this.salario * 12);
        return ganhoAnual;
    }


    void mostrarDados(){
        System.out.println("=============== DADOS DO FUNCIONARIO =================");
        System.out.println("NOME................: " + this.nome);
        System.out.println("DEPARTAMENTO........: " + this.departamento);
        System.out.println("SALARIO.............: " + this.salario );
        System.out.println("DATA DE NASCIMENTO..: " + this.data.dia + "/" + this.data.mes + "/" + this.data.ano); 
        System.out.println("RG..................: " + this.rg);
        System.out.println("SALARIO ANUAL.......: " + calculaGanhoAnual());
        System.out.println("================= FIM =================================");

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

    void adicionarFuncionario(Funcionario f){
        if(this.qtdMaximaFunc > 2){
            System.out.println("Não há mais espaços disponivel para adicionar novos funcionarios,limite maximo estourado");
        }else{
            this.empregados[qtdMaximaFunc]= f;
            this.qtdMaximaFunc ++;
        }

    }

    void mostrarDadosFuncionarios(){
        if(qtdMaximaFunc <= 0){
            System.out.println("Não há dados a serem mostrado");
        }
        for(int i=0; i < this.empregados.length; i++){
        System.out.println("=================================================");
        System.out.println("        DADOS DOS FUNCIONARIOS                   ");
        System.out.println("=================================================");
        System.out.println("Nome do Funcionario.............: " + this.empregados[i].nome);
        System.out.println("Departamento....................: " + this.empregados[i].departamento);
        System.out.println("Slario..........................: " + this.empregados[i].salario);
        System.out.println("Data de Nascimento..............: " + this.empregados[i].data.dia + "/" + this.empregados[i].data.mes + "/" + 
                                                                  this.empregados[i].data.ano);
        System.out.println("Rg..............................: " + this.empregados[i].rg);
        System.out.println("Empresa.........................: " + this.nome);
        System.out.println("CNPJ............................: " + this.cnpj);
        System.out.println("===================================================");
        System.out.println("                  FIM                              ");
        System.out.println("===================================================");
        System.out.println(" ");

        }
    }
public class TesteFuncionario {

    public static void main(String[] args) {

        // instanciando empresa

        Funcionario f1 = new Funcionario();
        f1.nome = "Renato Barbosa dos Santos";
        f1.departamento = "TI";
        f1.rg = "29.842.908-1";
        f1.salario = 2500;
        f1.estaNaEmpresa = true;
        // criando o objeto data apartir de um funcionario
        f1.data = new Data();

        f1.data.ano = 1984;
        f1.data.mes = 05;
        f1.data.dia = 22;

        // instanciando empresa
        Empresa empresa = new Empresa();
        empresa.nome = "Spread Tecnologia";
        empresa.cnpj = "123456798612";
        empresa.empregados = new Funcionario[3];
        f1 = empresa.empregados[0];

        // chamando metodo adicionar fucionario 1
        empresa.adicionarFuncionario(f1);

        // lista todos funcionarios adicinados no array
        empresa.mostrarDadosFuncionarios();

        // instanciando outro objeto
        Funcionario f2 = new Funcionario();
        f2.nome = "Fernanda baldasserini";
        f2.departamento = "Turismo";
        f2.rg = "23.543.987-1";
        f2.salario = 3600;
        f2.estaNaEmpresa = true;

        // instanciando objeto data
        Data dataNasc = new Data();
        dataNasc.ano = 1982;
        dataNasc.mes = 12;
        dataNasc.dia = 16;

        f2.data = dataNasc;

        // chamando metodo adicionar fucionario 1
        f2 = empresa.empregados[1];
        empresa.adicionarFuncionario(f2);

        // instanciando outro objeto
        Funcionario f3 = new Funcionario();
        f3.nome = "jessica Correia";
        f3.departamento = "Recepção";
        f3.rg = "23.543.987-3";
        f3.salario = 1800;
        f3.estaNaEmpresa = true;

        // instanciando objeto data
        Data dataNascimento = new Data();
        dataNascimento.ano = 1987;
        dataNascimento.mes = 11;
        dataNascimento.dia = 15;

        f3.data = dataNascimento;

        // chamando metodo adicionar fucionario 1
        f3 = empresa.empregados[2];
        empresa.adicionarFuncionario(f3);

        // lista todos funcionarios adicinados no array
        empresa.mostrarDadosFuncionarios();

        System.out.println("Dados atuais ");
        f1.mostrarDados();

        f1.bonifica(200);
        double ganhoAnual = f1.calculaGanhoAnual();

        System.out.println();
        System.out.println("DADOS ATUALIZADO DO FUNCIONARIO F1");
        f1.mostrarDados();
        System.out.println("Ganho anual....: " + ganhoAnual);

        System.out.println("Dados atuais ");
        f2.mostrarDados();

        f2.bonifica(300);
        ganhoAnual = f2.calculaGanhoAnual();

        System.out.println();

        System.out.println("DADOS ATUALIZADO DO FUNCIONARIO F2");
        f2.mostrarDados();

    }
5 respostas
solução!

Renato tem como formatar o seu código para facilitar a leitura dele aqui? Assim fica dificil de enteder

public class Funcionario {
    String nome;
    String departamento;
    double salario;
    Data data;
    String rg;
    boolean estaNaEmpresa;
    Empresa empresa;

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

    double calculaGanhoAnual(){
        double ganhoAnual;
        ganhoAnual = (this.salario * 12);
        return ganhoAnual;
    }


    void mostrarDados(){
        System.out.println("=============== DADOS DO FUNCIONARIO =================");
        System.out.println("NOME................: " + this.nome);
        System.out.println("DEPARTAMENTO........: " + this.departamento);
        System.out.println("SALARIO.............: " + this.salario );
        System.out.println("DATA DE NASCIMENTO..: " + this.data.dia + "/" + this.data.mes + "/" + this.data.ano); 
        System.out.println("RG..................: " + this.rg);
        System.out.println("SALARIO ANUAL.......: " + calculaGanhoAnual());
        System.out.println("================= FIM =================================");
public class Empresa {
    String nome;
    Funcionario[] empregados;
    String cnpj;
    int qtdMaximaFunc = 0;

    void adicionarFuncionario(Funcionario f){
        if(this.qtdMaximaFunc > 2){
            System.out.println("Não há mais espaços disponivel para adicionar novos funcionarios,limite maximo estourado");
        }else{
            this.empregados[qtdMaximaFunc]= f;
            this.qtdMaximaFunc ++;
        }

    }

    void mostrarDadosFuncionarios(){
        if(qtdMaximaFunc <= 0){
            System.out.println("Não há dados a serem mostrado");
        }
        for(int i=0; i < this.empregados.length; i++){
        System.out.println("=================================================");
        System.out.println("        DADOS DOS FUNCIONARIOS                   ");
        System.out.println("=================================================");
        System.out.println("Nome do Funcionario.............: " + this.empregados[i].nome);
        System.out.println("Departamento....................: " + this.empregados[i].departamento);
        System.out.println("Slario..........................: " + this.empregados[i].salario);
        System.out.println("Data de Nascimento..............: " + this.empregados[i].data.dia + "/" + this.empregados[i].data.mes + "/" + 
                                                                  this.empregados[i].data.ano);
        System.out.println("Rg..............................: " + this.empregados[i].rg);
        System.out.println("Empresa.........................: " + this.nome);
        System.out.println("CNPJ............................: " + this.cnpj);
        System.out.println("===================================================");
        System.out.println("                  FIM                              ");
        System.out.println("===================================================");
        System.out.println(" ");

        }
    }
public class TesteFuncionario {

    public static void main(String[] args) {

        Funcionario f1 = new Funcionario();
        f1.nome = "Renato Barbosa dos Santos";
        f1.departamento = "TI";
        f1.rg = "29.842.908-1";
        f1.salario = 2500;
        f1.estaNaEmpresa = true;
        // criando o objeto data apartir de um funcionario
        f1.data = new Data();

        f1.data.ano = 1984;
        f1.data.mes = 05;
        f1.data.dia = 22;

        // instanciando empresa
        Empresa empresa = new Empresa();
        empresa.nome = "Spread Tecnologia";
        empresa.cnpj = "123456798612";
        empresa.empregados = new Funcionario[3];
        f1 = empresa.empregados[0];

        // chamando metodo adicionar fucionario 1
        empresa.adicionarFuncionario(f1);

        // lista todos funcionarios adicinados no array
        empresa.mostrarDadosFuncionarios();

        // instanciando outro objeto
        Funcionario f2 = new Funcionario();
        f2.nome = "Fernanda baldasserini";
        f2.departamento = "Turismo";
        f2.rg = "23.543.987-1";
        f2.salario = 3600;
        f2.estaNaEmpresa = true;

        // instanciando objeto data
        Data dataNasc = new Data();
        dataNasc.ano = 1982;
        dataNasc.mes = 12;
        dataNasc.dia = 16;

        f2.data = dataNasc;

        // chamando metodo adicionar fucionario 1
        f2 = empresa.empregados[1];
        empresa.adicionarFuncionario(f2);

        // instanciando outro objeto
        Funcionario f3 = new Funcionario();
        f3.nome = "jessica Correia";
        f3.departamento = "Recepção";
        f3.rg = "23.543.987-3";
        f3.salario = 1800;
        f3.estaNaEmpresa = true;

        // instanciando objeto data
        Data dataNascimento = new Data();
        dataNascimento.ano = 1987;
        dataNascimento.mes = 11;
        dataNascimento.dia = 15;

        f3.data = dataNascimento;

        // chamando metodo adicionar fucionario 1
        f3 = empresa.empregados[2];
        empresa.adicionarFuncionario(f3);

        // lista todos funcionarios adicinados no array
        empresa.mostrarDadosFuncionarios();

        System.out.println("Dados atuais ");
        f1.mostrarDados();

        f1.bonifica(200);
        double ganhoAnual = f1.calculaGanhoAnual();

        System.out.println();
        System.out.println("DADOS ATUALIZADO DO FUNCIONARIO F1");
        f1.mostrarDados();
        System.out.println("Ganho anual....: " + ganhoAnual);

        System.out.println("Dados atuais ");
        f2.mostrarDados();

        f2.bonifica(300);
        ganhoAnual = f2.calculaGanhoAnual();

        System.out.println();

        System.out.println("DADOS ATUALIZADO DO FUNCIONARIO F2");
        f2.mostrarDados();

    }

Achei bem confuso esses metodos kkk, fiz algumas alterações aqui para você.

public class Empresa {
     String nome;
    Funcionario[] empregados;
    String cnpj;


    void adicionarFuncionario(Funcionario f){
        for(int i = 0; i < empregados.length; i++) {
            this.empregados[i] = f;
        }
    }

    void mostrarDadosFuncionarios(){
        if(empregados.length < 0) {
            System.out.println("Não tem nenhum funcionario");
        }
        for(int i=0; i < this.empregados.length; i++){
        System.out.println("=================================================");
        System.out.println("        DADOS DOS FUNCIONARIOS                   ");
        System.out.println("=================================================");
        System.out.println("Nome do Funcionario.............: " + this.empregados[i].nome);
        System.out.println("Departamento....................: " + this.empregados[i].departamento);
        System.out.println("Slario..........................: " + this.empregados[i].salario);
        System.out.println("Data de Nascimento..............: " + this.empregados[i].data.dia + "/" + this.empregados[i].data.mes + "/" + 
                                                                  this.empregados[i].data.ano);
        System.out.println("Rg..............................: " + this.empregados[i].rg);
        System.out.println("Empresa.........................: " + this.nome);
        System.out.println("CNPJ............................: " + this.cnpj);
        System.out.println("===================================================");
        System.out.println("                  FIM                              ");
        System.out.println("===================================================");
        System.out.println(" ");

        }
    }

depois.

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

           Funcionario funcionario = new Funcionario();
           funcionario.nome = "TESTE";
           funcionario.departamento = "PROGRAMADOR";
           funcionario.estaNaEmpresa = true;
           funcionario.rg = "321320";
           funcionario.salario = 1500.0;

           Data data = new Data();
           data.dia = 10;
           data.mes = 8;
           data.ano = 2017;
           funcionario.data = data;

           Empresa empresa = new Empresa();
           empresa.cnpj = "131321";
           empresa.nome = "GLASS FISH";
           empresa.empregados = new Funcionario[1];
           funcionario.empresa = empresa;


           empresa.adicionarFuncionario(funcionario);
           empresa.mostrarDadosFuncionarios();
        }

Boa tarde, Renato! Como vai?

Aparentemente o problema do seu código está na classe TesteFuncionario. Logo no início do método main vc faz o seguinte:

Funcionario f1 = new Funcionario();
//define os dados do funcionário...

// instanciando empresa
Empresa empresa = new Empresa();

//define os dados da empresa...

empresa.empregados = new Funcionario[3];
f1 = empresa.empregados[0];

Repare que nas duas últimas linhas o que é feito é:

1) Criar um array de funcionários e armazenar ele em empresa.empregados.

2) Atribuir à f1 o valar da posição 0 do array de funcionários criado no ponto 1.

Repare que nesse momento, o seu array estava completamente vazio. Ou seja, no passo 2, o que foi feito foi atribuir à variável f1 o valor null. Por isso, no momento que vc faz a chamada ao método mostrarDadosFuncionarios() vc recebe um NullPointerException. Afinal de contas, dentro do seu método vc irá tentar acessar as informações dos empregados adicionados no array, no entanto, tudo que vc adicionou foi uma referência nula.

Dica: Quando vc tiver problemas com exceptions, procure postar junto do seu código a stacktrace (pilha de exceções) gerada pelo seu código.

Não deixe de nos dar um retorno sobre o seu problema para sabermos se foi tudo resolvido!

Abraço,Gabriel Leite.

Obrigado pelas dicas consegui resolver o problema.