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

Dúvida no Ex. 3 da Aula 4 - Arrays

Pessoal, alguém consegue me ajudar? Não sei o que acontece aqui. Segue meu código:

// Empresa
class Empresa {
    String nomeEmpresa;
    String cnpj;
    String endereco;
    Funcionario[] empregados;
    int livre = 0;

// Adiciona Funcionário
    void adiciona ( Funcionario f ) {
        this.empregados[ this.livre ] = f;
        this.livre ++;
    }
}

// Funcionário
class Funcionario {
    Pessoa pessoa;
    String departamento;
    double salario;
    Data dataEntrada;

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

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

    double calculaInss() {
        return this.salario*0.11;
    }

    double calculaIrrf() {
        return this.salario*0.15-this.calculaInss();
    }

    double calculaSalarioComDescontos() {
        return this.salario-this.calculaInss()-this.calculaIrrf();
    }

    void mostra() {
        pessoa.mostra();
        System.out.println( "Departamento : " + this.departamento );
        System.out.println( "Salário Bruto: " + this.salario );
        dataEntrada.mostra();
        System.out.println( "----------------------" );
    }
}

// Pessoa
class Pessoa {
    String nome;
    String rg;

    void mostra() {
        System.out.println("Nome: " + this.nome);
        System.out.println("RG: " + this.rg);
    }

}

// Data
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;
    }

    void mostra() {
        System.out.println( "Data de Admissão: " + dia + "/" + mes + "/" + ano );
    }
}

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

        Funcionario f1 = new Funcionario();
        f1.pessoa = new Pessoa();
        f1.pessoa.nome = "Funcionário 01";
        f1.pessoa.rg = "11223344";
        f1.dataEntrada = new Data();
        f1.dataEntrada.preencheData ( 10, 12, 2013 );
        f1.salario = 3000.00;
        f1.departamento = "Cobrança";
        empresa.adiciona( f1 );

        Funcionario f2 = new Funcionario();
        f2.pessoa = new Pessoa();
        f2.pessoa.nome = "Funcionário 02";
        f2.pessoa.rg = "22334455";
        f2.dataEntrada = new Data();
        f2.dataEntrada.preencheData ( 15, 9, 2011 );
        f2.salario = 4000.00;
        f2.departamento = "Design";
        empresa.adiciona( f2 );

        for ( int i = 0; i < empresa.empregados.length; i++ ) {
            empresa.empregados[i].mostra();
        }

    }
}

Quando mando rodar o testeEmpresa, dá o seguinte erro:

Antonios-MacBook-Pro:Curso Java neto$ java testeEmpresa
Nome: Funcionário 01
RG: 11223344
Departamento : Cobrança
Salário Bruto: 3000.0
Data de Admissão: 10/12/2013
----------------------
Nome: Funcionário 02
RG: 22334455
Departamento : Design
Salário Bruto: 4000.0
Data de Admissão: 15/9/2011
----------------------
Exception in thread "main" java.lang.NullPointerException
    at testeEmpresa.main(empresa.java:108)

Obrigado!!!

3 respostas
solução!

Olá Antonio! O erro está sendo causado em seu for(). Veja bem, você colocou o loop para ser executado enquanto o valor da variável i for menor que o tamanho da Array empregados. Porém, perceba que você instanciou a Array com tamanho 20:

empresa.empregados = new Funcionario[ 20 ];

Logo, enquanto o valor de i for menor que 20 o loop será executado. Mas ai que está o problema, sua Array está da seguinte forma:

{f1, f2, null, null, null .... }

Segundo seu for() a Array deve ser percorrida e a cada repetição deve-se executar o método mostra(). Porem como eu disse anteriormente, sua Array continuará com as repetições até i não ser menor que 20 pois foi a condição por você implementada no for().

Então perceba que quando i vale 2, o valor pego é null gerando assim uma NullPointerException.

java.lang.NullPointerException

Para não dar o erro, um simples if() resolve o problema. Fazendo apenas chamar o método mostra() quando o valor na Array não for null, ficando assim:

for ( int i = 0; i < empresa.empregados.length; i++ ) {
            if(empresa.empregados[i] != null){
                empresa.empregados[i].mostra();
            }
        }

Espero ter ajudado! Bons Estudos!

Boa tarde Antonio Delgado! Você criou uma array do tipo Funcionario com 20 posições.

empresa.empregados = new Funcionario[20];

Ou seja! A array empregados reservou espaço na memoria para 20 referencias para objetos do tipo Funcionario, mas até esse ponto estão todas nulas (null).

Você logo em seguida cria dois objetos do tipo Funcionario , o f1 e o f2 e respectivamente usando o método adiciona() coloca esses dois objetos nas duas primeiras posições desse array, ou seja, no indice [0] e no indice[1]. Agora a parte de seu problema.

for ( int i = 0; i < empresa.empregados.length; i++ ) {
            empresa.empregados[i].mostra();
        }

Com esse seu laço for, você pegou o tamanho total do array, que nesse caso foi reservado 20 espaços para referencias do tipo Funcionarios. Aqui esta o problema, pois você colocou apenas dois obejtos nesse array, no indice 0 e 1, quando o laço chega no indice 2 não existe nem um objeto Funcionario lá dentro. Teste alterar em seu codigo a seguinte linha

empresa.empregados = new Funcionario[20];

para

empresa.empregados = new Funcionario[2];

Tendo assim apenas duas posições e o seu laço terá o mesmo tamanho da quantidade de Funcionarios que foram colocados em sua array e assim não haverá mais esse erro.

Uma outra forma de resolver seu problema de uma melhor forma é modificar a linha

for ( int i = 0; i < empresa.empregados.length; i++ ) {
            empresa.empregados[i].mostra();
        }

Por essa outra

  for ( int i = 0; i < empresa.livre; i++ ) {
            empresa.empregados[i].mostra();
        }

Dessa forma, você garante que o seu laço for sempre percorrera seu array apenas com o tamanho de quantidade de vezes que funcionários foram colocados com o metodo adiciona() Lembra que toda vez que se adiciona um funcionario com esse metodo essa propriedade livre que havia começado com valor 0 é incrementada em mais 1? Se colocar 6 funcionarios, ela tera valor 6, e no seu laço for ele percorrera ate esse limite de 6 indices, evitando chegar no indice 7 que até o momento estaria nulo (null). Dessa forma você pode deixar a seu array com tamanho 20 mesmo ou qualquer outro tamanho.

empresa.empregados = new Funcionario[20];

////////////////////////////////////// Código com a modificação.

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

        Funcionario f1 = new Funcionario();
        f1.pessoa = new Pessoa();
        f1.pessoa.nome = "Funcionário 01";
        f1.pessoa.rg = "11223344";
        f1.dataEntrada = new Data();
        f1.dataEntrada.preencheData ( 10, 12, 2013 );
        f1.salario = 3000.00;
        f1.departamento = "Cobrança";
        empresa.adiciona( f1 );

        Funcionario f2 = new Funcionario();
        f2.pessoa = new Pessoa();
        f2.pessoa.nome = "Funcionário 02";
        f2.pessoa.rg = "22334455";
        f2.dataEntrada = new Data();
        f2.dataEntrada.preencheData ( 15, 9, 2011 );
        f2.salario = 4000.00;
        f2.departamento = "Design";
        empresa.adiciona( f2 );
        /**
        for ( int i = 0; i < empresa.empregados.length; i++ ) {
            empresa.empregados[i].mostra();
        }
        **/
        for ( int i = 0; i < empresa.livre; i++ ) {
            empresa.empregados[i].mostra();
        }

    }
}

Muito obrigado pelas respostas! Rodei o código novamente aqui e agora deu certinho (das duas maneiras apresentadas).

Um abraço e muito obrigado!