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

java.lang.NullPointerException 2

O programa compilou mas apareceu essa mensagem aí. Não sei o que significa. Vi que tinha um post semelhante no fórum, mas não entendi a resolução.

Exception in thread "main" java.lang.NullPointerException
        at Empresa.mostraEmpregados(Empresa.java:16)
        at TestaEmpresa.main(TestaEmpresa.java:14)
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;
      empresa.adiciona(f);
    }
    empresa.mostraEmpregados();
  }
}
class Empresa {
  String nome;
  String cnpj;
  String endereco;
  Funcionario empregados[] = new Funcionario[10];
  int livre;

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

  void mostraEmpregados() {
    for(int i = 1; i <= this.empregados.length; i++) {
      System.out.println("Funcionario: " + i);
      System.out.println("Nome: " + this.empregados[i].nome);
      System.out.println("RG: " + this.empregados[i].RG);
      System.out.println("Funcao: " + this.empregados[i].funcao);
      System.out.println("Departamento: " + this.empregados[i].departamento);
      System.out.println("Salario: " + this.empregados[i].salario);
      System.out.println("Data: " + this.empregados[i].dataEntrada.getDataFormatada());
    }
  }
}
class Funcionario {
  String nome;
  String RG;
  String departamento;
  String funcao;
  double salario;
  Data dataEntrada = new Data();

  void recebeAumento(double percentualAumento) {
    this.salario += (salario * percentualAumento);
  }

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

  void mostra() {
    System.out.println("Nome: " + this.nome);
    System.out.println("RG: " + this.RG);
    System.out.println("Funcao: " + this.funcao);
    System.out.println("Departamento: " + this.departamento);
    System.out.println("Salario: " + this.salario);
    System.out.println("Data: " + this.dataEntrada.getDataFormatada());
  }
}
class Data {
  int dia;
  int mes;
  int ano;

  void preencheData (int dia, int mes, int ano) {
    this.dia = dia;
    this.mes = mes;
    this.ano = ano;
  }

  String getDataFormatada() {
    return this.dia + "/" + this.mes + "/" + this.ano;
  }
}
4 respostas
solução!

Na pratica, você esta tentando percorrer um Array de 10 Funcionarios e imprimindo na tela. O problema é que na classe testa Empresa, você só adiciona 5 funcionarios. O programa lhe retornou o erro pois os outros 5 lugares que nao foram adicionados, estão nulos. Dai vem o NullPointerException.

Note também que você, no método mostraEmpregados(), começa a percorrer o Array do segundo funcionario (as casas nos arrays começam com 0 e voce colocou 1 ).

Se me permite, eu já fiz um exemplo para voce. Alterei apenas essas duas classes.

Na TestaEmpresa, mudei o for que adiciona os funcionarios passando de 5 para 10. E na classe da Empresa, método mostraEmpregados(), comecei a mostrar do Empregado numero 0 ate o tamanho do array, apenas com o < .

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

        for(int i = 0; i < 10; i++) {
          Funcionario f = new Funcionario();
          f.salario = 1000 + i * 100;
          empresa.adiciona(f);
        }
        empresa.mostraEmpregados();
      }
    }
      void mostraEmpregados() {
        for(int i = 0; i < this.empregados.length; i++) {
          System.out.println("Funcionario: " + i);
          System.out.println("Nome: " + this.empregados[i].nome);
          System.out.println("RG: " + this.empregados[i].RG);
          System.out.println("Funcao: " + this.empregados[i].funcao);
          System.out.println("Departamento: " + this.empregados[i].departamento);
          System.out.println("Salario: " + this.empregados[i].salario);
        }
      }

Ok, mas o método adiciona não resolve o problema de preenchimento do array através do atributo livre? Das posições vazias?

Nao, ele apenas nao deixa que 2 funcionarios sejam adicionados no mesmo indice. O problema é que mesmo assim você apenas adiciona os 5 funcionarios e o mostraEmpregados percorre 10.

Se nao me engano, a saida no console é de 5 funcionarios e quando vai para o 6 ele retorna o NullPointer.

Hum, ok.