Solucionado (ver solução)

Importante

Você está vendo a versão anterior da nova experiência da Alura que estamos preparando para você. Em breve, ela ganha uma identidade visual novinha totalmente pensada em potencializar seus estudos!

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