3
respostas

O código compila, mas na hora de rodar, dá "NullPointerException".

Código da classe Empresa:

class Empresa{
    private String nome;
    private String cnpj;
    public Funcionario[] funcionarios = new Funcionario[4];

    Empresa (String nome, String cnpj, Funcionario[] func){
        this.nome = nome;
        this.cnpj = cnpj;
        this.funcionarios = func;
    }

    public String getNome(){
        return this.nome;
    }

    public String getCnpj(){
        return this.cnpj;
    }

    public Funcionario getFuncionario(int posicao){
        return this.funcionarios[posicao];
    }

    public void setNome (String nome){
        this.nome = nome;
    }

    public void setCnpj (String cnpj){
        this.cnpj = cnpj;
    }

    public void setFuncionario (Funcionario func, int i){
        this.funcionarios[i] = func;
    }

    public void adiciona(Funcionario f){
        for (int i = 0; i < funcionarios.length; i++){
            if (funcionarios[i] == null){
                funcionarios[i] = f;
                continue;
            }
        }
    }

    public void mostraTodasAsInformacoes(){
        for (int i=0; i < funcionarios.length; i++){
            if (this.funcionarios[i] == null)
                continue;
            this.funcionarios[i].mostra();
        }
    }

    public boolean contem(Funcionario func){
        for (int i=0; i < funcionarios.length; i++){
            if (func == funcionarios[i]){
                System.out.println ("O funcionário PERTENCE à empresa!");
                return true;
            }
        }
        System.out.println ("O funcionário NÃO PERTENCE à empresa!");
        return false;
    }

}

Código da classe TestaEmpresa:

class TestaEmpresa{

    public static void main (String[] args){

        Empresa empresa = new Empresa("Stractus", "91.010.292/0001-22", null);

        Funcionario func = new Funcionario ("Marcos", "Marketing", 1250.0, 02, 01, 2016, "1234");
        empresa.
    }
}

Nem sei mais o que fazer, já mexi pra lá e pra cá e não tem jeito de rodar!!! =/

3 respostas

Porque você incializa o atributo funcionários com um array de tamanho 4, mas usa um constructor passando um valor null a ser atribuído ao mesmo atributo?

Faça o seguinte, experimento criar um constructor assim:

Empresa (String nome, String cnpj){
        this.nome = nome;
        this.cnpj = cnpj;
    }

E use-o. Provavelmente vai dar certo :)

Olá Fernanda,

uma observação sobre a sua pergunta é que ela não apresenta seu código completo e nem o erro mostrado no console. Isso facilita para quem for te ajudar :)

Pude notar alguns errinhos na sua classe Empresa. Vamos por partes:

  public void mostraTodasAsInformacoes(){
        for (int i=0; i < funcionarios.length; i++){
            if (this.funcionarios[i] == null)
                continue;
            this.funcionarios[i].mostra();
        }
    }

Seu if está sem chaves, logo dentro desse bloco só é executado o continue. Na verdade deveria ter uma outra regra... só faz sentido tentar exibir as infos do funcionário caso ele não esteja NULL:

  public void mostraTodasAsInformacoes(){
        for (int i=0; i < funcionarios.length; i++){
            if (this.funcionarios[i] != null)
                  this.funcionarios[i].mostra();
        }
    }

Já no seu método adiciona pude notar outro erro cometido. O primeiro funcionário adicionado acaba sendo inserido em todas as posições nulas iniciais. Você deveria dar um break em vez de continue:

public void adiciona(Funcionario f){
        for (int i = 0; i < funcionarios.length; i++){
            if (funcionarios[i] == null){
                funcionarios[i] = f;
                break;
            }
        }
    }

Agora o seu erro que provavelmente está causando essa NULLPointerException é que quando a Empresa é instanciada você passa NULL no construtor. E esse construtor por sua vez associa esse valor ao atributo funcionário. Tenho algumas observações pra te ajudar... Pra resolver esse erro de maneira simples poderia trocar isso:

Empresa empresa = new Empresa("Stractus", "91.010.292/0001-22", null);

Por:

Empresa empresa = new Empresa("Stractus", "91.010.292/0001-22", new Funcionario[4]);

Mas observa que lá dentro da sua classe empresa você já faz com que toda empresa já tenha um Array de 4 posições quando tem essa declaração:

class Empresa{
    private String nome;
    private String cnpj;

    //AQUI
    public Funcionario[] funcionarios = new Funcionario[4];

Logo ou vc mantém como sendo 4 e tira do construtor a passagem desse Array:

Empresa (String nome, String cnpj){
        this.nome = nome;
        this.cnpj = cnpj;
    }

Ou você não inicializa o atributo mantendo o seu construtor. A abordagem que você vai escolher depende do objetivo:

  • Se quiser permitir que a empresas possam ter quantidades de funcionários diferentes: mantém seu construtor e remove aquela inicialização feita no atributo(ele é desnecessário)

  • Se quiser fazer com que toda empresa sempre tenha 4 funcionários. Você pode deixar sua incialização no atributo e remover esse parâmetro do construtor.

Ajudou?

Legal Fábio!