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

Exception in thread "main" java.lang.NullPointerException

O meu código está dando o erro Exception in thread "main" java.lang.NullPointerException at Funcionario.mostra(Funcionario.java:25) at Empresa.mostraTodasAsInformacoes(Funcionario.java:61) at TestaArrayFuncionario.main(TestaArrayFuncionario.java:29). Qualquer ajuda será muito bem-vinda. Obrigado.

public class TestaArrayFuncionario {
    public static void main (String[] args) {
        Empresa empresa = new Empresa();

        empresa.empregados = new Funcionario[10];

           Funcionario f1 = new Funcionario();

           f1.nome = "JOSE";
           f1.salario = 3000;
           f1.depto = "RH";
           f1.funcao = "Analista RH";
           f1.sexo = "M";

           empresa.adiciona(f1);

           Funcionario f2 = new Funcionario();

           f2.nome = "JOAO";
           f2.salario = 4000;
           f2.depto = "RH";
           f2.funcao = "Gerente";
           f2.sexo = "M";

          empresa.adiciona(f2);  


        empresa.mostraTodasAsInformacoes();
    }
}
public class Funcionario {
    String nome, depto, funcao ;
    double salario;
    String sexo ;
    String estadoCivil;
    String RG;
    Data dataEntrada ;

    void recebeAumento(double valor, Funcionario nome) {
        this.salario += valor;
    }

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

    void mostra() {
        System.out.println("Nome :" + this.nome);
        System.out.println("Depto :" + this.depto);
        System.out.println("Função :" + this.funcao);
        System.out.println("Salário :" + this.salario);
        System.out.println("Sexo :" + this.sexo);
        System.out.println("Data Admissao :" + dataEntrada.getDataEntrada());
        System.out.println("Estado Civil :" + this.estadoCivil);
        System.out.println("RG :" + this.RG);
        System.out.println("--------------------------------------");        

    }


}

class Data{
    int dia;
    int mes;
    int ano;
    String dataEntrada;

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

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

    int livre = 0;

    public void adiciona(Funcionario f) {
           this.empregados[this.livre] = f;
           this.livre++;
    }

    void mostraTodasAsInformacoes() {
        for (int i = 0; i <= this.livre; i++) {
            System.out.println("Funcionário na posição: " + i);
            this.empregados[i].mostra();
        }
    }

    boolean contem(Funcionario f) {
        for (int i = 0; i < this.livre; i++) {
            if (f == this.empregados[i]) {
                return true;
            }
        }
        return false;
    }    

}
4 respostas
solução!

Boa noite, Gilvani! Como vai?

O que está acontecendo é o seguinte:

Vc está criando vários funcionários e adicionando eles na empresa. Daí no final vc faz empresa.mostraTodasAsInformacoes();. Esse método vai iterar por cada um dos funcionários da empresa pedindo pra mostrar cada um deles executando this.empregados[i].mostra();.

E é aqui que a porca vai torcer o rabo! Vamos olhar de perto o que vc faz dentro do método mostra():

void mostra() {
        System.out.println("Nome :" + this.nome);
        System.out.println("Depto :" + this.depto);
        System.out.println("Função :" + this.funcao);
        System.out.println("Salário :" + this.salario);
        System.out.println("Sexo :" + this.sexo);
        System.out.println("Data Admissao :" + dataEntrada.getDataEntrada());
        System.out.println("Estado Civil :" + this.estadoCivil);
        System.out.println("RG :" + this.RG);
        System.out.println("--------------------------------------");        

}

Repare que uma das linhas desse método tenta fazer com que seja impresso no console a data de admissão do funcionário fazendo System.out.println("Data Admissao :" + dataEntrada.getDataEntrada());.

No entanto, veja que vc não deu definiu a data de admissão de nenhum dos seus funcionários! Isso implica que todas elas são nulas, e como vc está tentando acessar o método getDataEntrada() de algo que é nulo, explode a bomba chamada NullPointerException!

Para resolver esse problema, vc terá que dar uma data de admissão para cada um dos seus funcionários!

Pegou a ideia?

Aprendizado para a vida: Sempre que criar um método que vc deseja permitir que seja acessado lembre-se de utilizar o modificador public! No seu método mostra() vc não o colocou e em alguns outros métodos que vc fez e que são públicos vc tbm não colocou!

Grande abraço e bons estudos!

Oi Gilvani, tudo certo? Meu nome é Guido, e sou um estudante aqui da alura. Observando o seu código, percebi que você não construiu o objeto Data na memória, para atribuir sua referência na variável dataEntrada em sua classe TestaArrayFuncionario. Quando tentamos acessar um método de um objeto que ainda não foi criado, o java dá esse erro chamado de null pointer exception, que indica que a variável dataEntrada está nula, não apontando para nenhum objeto do tipo Data. Segue uma possível solução.

public class TestaArrayFuncionario {
    public static void main (String[] args) {
        Empresa empresa = new Empresa();

        empresa.empregados = new Funcionario[10];

           Funcionario f1 = new Funcionario();

           f1.nome = "JOSE";
           f1.salario = 3000;
           f1.depto = "RH";
           f1.funcao = "Analista RH";
           f1.sexo = "M";
f1.dataEntrada = new Data();
f1.dataEntrada.dia = 15;
f1.dataEntrada.mes = 05;
f1.dataEntrada.ano = 2015;
           empresa.adiciona(f1);

           Funcionario f2 = new Funcionario();

           f2.nome = "JOAO";
           f2.salario = 4000;
           f2.depto = "RH";
           f2.funcao = "Gerente";
           f2.sexo = "M";
f2.DataEntrada = new Data();
f2.dataEntrada.dia = 12;
f2.dataEntrada.mes = 01;
f2.dataEntrada.ano = 2012;
          empresa.adiciona(f2);  


        empresa.mostraTodasAsInformacoes();
    }
}

Seria interessante que, na classe Data, tivesse um método para que a data criada pudesse ser preenchida, para evitarmos escrever o dia, o mes e o ano na variável dataEntrada no objeto do tipo Empresa. Exemplo:

class Data {
int dia;
int mes;
int ano;
String data;
public void defineData(int dia, int mes, int ano) {
this.dia = dia;
this.mes = mes;
this.ano = ano;
}
}

Agora, podemos criar uma data na memória, e já estar com os valores setados.

Data data = new Data();
data.defineData(2, 2, 2012);
funcionario.dataEntrada = data;

Espero ter ajudado! Qualquer dúvida, continue postando.

Muito bom, obrigado pessoal! As explicações foram muito objetivas e didáticas.

Por nada, Gilvani!

Sempre que tiver qualquer dúvida é só procurar o pessoal aqui no fórum!

Grande abraço e bons estudos!

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