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

java.lang.NullPointerException

Não entendi o motivo da exceção:

public class TestaEmpresa {

    public static void main(String[] args) {
        Empresa empresa = new Empresa();
        empresa.empregados = new Funcionario[10];

        for (int i = 0; i < 5; i++) {
            Funcionario f = new Funcionario();
            f.salario = 1000 + i * 100;
            f.nome = "teste";
            empresa.adiciona(f);
        }
//          empresa.empregados[0].mostra();
//        empresa.empregados[1].mostra();
          empresa.mostraEmpregados();
    }

void mostraEmpregados() {
            for (int i = 0; i < this.livre; i++) {
                System.out.println("Funcionário na posição: " + i);
                System.out.println("Nome: " + this.empregados[i].nome);
                System.out.println("R$" + this.empregados[i].salario);
                System.out.println("Datade entrada: " + this.empregados[i].dataEntrada);
                System.out.println("Departamento: " + this.empregados[i].departamento);
                System.out.println("RG: " + this.empregados[i].rg);

            }
        }
10 respostas

Thamirys,

Onde está ocorrendo o erro? Posta a mensagem de erro completa que apareceu?

OBS: Lembra de usar o botão e colocar o código dentro do bloco para que ele venha formatado.

Abraço!

Exception in thread "main" java.lang.NullPointerException at programacaojava.Empresa.mostraEmpregados(Empresa.java:18) at programacaojava.TestaEmpresa.main(TestaEmpresa.java:17)

void mostraEmpregados() {
            for (int i = 0; i < this.livre; i++) {
                System.out.println("Funcionário na posição: " + i);
                System.out.println("Nome: " + this.empregados[i].nome);
                System.out.println("R$" + this.empregados[i].salario);
                System.out.println("Datade entrada: " + this.empregados[i].dataEntrada);
                System.out.println("Departamento: " + this.empregados[i].departamento);
                System.out.println("RG: " + this.empregados[i].rg);

            }
        }

Thamirys,

Você está tentando acessar uma posição do seu array de funcionarios que está nula. Perceba que no seu main você popula o Array até a posição de número 4.

No seu for de mostraEmpregados, você busca até a posição do atributo livre. Veja qual o valor do seu atributo livre pois deve estar com um valor maior do que deveria.

Abraço!

Bom dia,

Se colocar aqui o código completo da classe Empresa fica fácil de achar o ponto exato do problema.

Abraço.

Classe empresa:

package programacaojava;

public class Empresa {

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

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

        void mostraEmpregados() {
            for (int i = 0; i < this.livre; i++) {
                System.out.println("Funcionário na posição: " + i);
                System.out.println("Nome: " + this.empregados[i].nome);
                System.out.println("R$" + this.empregados[i].salario);
                System.out.println("Datade entrada: " + this.empregados[i].dataEntrada);
                System.out.println("Departamento: " + this.empregados[i].departamento);
                System.out.println("RG: " + this.empregados[i].rg);

            }
        }


}

Ao que parece o problema não é no atributo livre, ele está ficando com o valor correto e o laço do mostraEmpregados() está certinho. Poste o código da classe que falta, a Funcionario, por favor.

Posta também o que está imprimindo na saída do console ou do terminal de onde você está executando o código?

Classe funcionário

class Funcionario {

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


    Data dataDeEntrada = new Data();
    void recebeAumento(double valor){
        this.salario += valor;
    }
    double calculaGanhoAnual(){
        return this.salario * 12;
    }

    void mostra() {
        System.out.println("Nome: " + this.nome);
        System.out.println("Depatarmento: " + this.departamento);
        System.out.println("Salário: " + this.salario);
        System.out.println("RG: " + this.rg);

        System.out.println("Dia: " + this.dataDeEntrada.dia);
        System.out.println("Mês: " + this.dataDeEntrada.mes);
        System.out.println("Ano: " + this.dataDeEntrada.ano);
    }
}
solução!

Thamirys,

Eu fiz seu exemplo aqui pegando as classes que você colocou nesse post, a única coisa que mudei foi:

Classe Funcionario:

Removi essa linha:

 Data dataDeEntrada = new Data();

Troquei o tipo do atributo dataEntrada para Data.

Ajustei o nome do atributo no método mostra(), ou seja, troquei as referências de dataDeEntrada por dataEntrada.

E apaguei as linhas que mostravam cada campo da Data separado no mostra(), usando no lugar isto:

System.out.println("Data Entrada: " + this.dataEntrada.getDataFormatada());

E minha classe Data está assim:

public class Data {

    int dia;
    int mes;
    int ano;

    public Data(int dia, int mes, int ano) {
        this.dia = dia;
        this.mes = mes;
        this.ano = ano;
    }

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

}

Com isso rodei o teste e funcionou como esperado. Não fiz mais nenhuma alteração, as classes Empresa e TestaEmpresa ficaram iguais as suas.

Dá uma olhadinha e testa aí por favor.

Ok, Obrigada Emerson. Funcionou

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