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

Duvida dos exercícios 3 e 4: váriavel livre

Galera eu não entendi muito bem o papel da variável livre da classe empresa:

class Empresa {

    String nome;
    long cnpj;
    Funcionario[] funcionarios;
    int livre = 0;

    void adiciona(Funcionario fun) {

        this.funcionarios[this.livre] = fun;
        this.livre++;

    }

    void mostraFuncionarios(){

        for( int i = 0; i < this.livre; i++ ){
            System.out.println("Funcionario na posição: " + i);
            System.out.println("Salario: R$ " + this.funcionarios[i].salario);

        }
    }
}
void mostraFuncionarios(){

        for( int i = 0; i < this.funcionarios.length; i++ ){
            System.out.println("Funcionario na posição: " + i);
            System.out.println("Salario: R$ " + this.funcionarios[i].salario);

        }
    }

Eu fiz o método mostraFuncionarios de duas formas usando o this.funcionarios.length e o this.livre. Quando eu executo a classeTestaEmpresa com o this.funcionarios.length e um array de 10 posições, ele mostra os quatro funcionários que eu criei e depois dá um erro de NullPointerException. Com o this.livre, mostra os quatro sem o erro.

Agradeço desde já qualquer esclarecimento!

4 respostas

Olá Rodrigo, tudo bem?

A variável livre serve para guardar a posição do array que está livre para se usada, preenchida por algum valor. Quando você faz o 'for' utilizando esta variável, você acaba mostrando todas as posições que estão ocupadas. Já quando se usa o 'length', você está mostrando todas as posições deste array. O erro ocorreu pois o seu vetor de funcionários não está completo e quando o laço atinge um posição que tem seu valor nulo, ou null, é lançada uma exceção, neste caso, NullPointerException.

Obrigado Filipe. Nesse caso, como eu deixaria o meu vetor completo? Pode me explicar? Eu tentei alguma opções aqui, mas não deu muito certo.

solução!

Caso você tenha um vetor com 10 posições, você pode instanciar 10 funcionários e para cada posição do array atribuir a ela cada uma destas instâncias. Ou cria apenas um funcionário e para as 10 posições atribuir este objeto, mas isso não faz muito sentido.

Obrigado mais uma vez!