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

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

Boa tarde! Meu código ficou assim:

class Funcionario {
            String nome;
            double salario;
            Data dataEntrada;
            String dep;
            String rg;

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

            double calculaGanhoAnual() {
            return this.salario*12;
            }
            void mostra() {
                System.out.println("Nome: " + this.nome);
                System.out.println("Departamento: " +this.dep);
                System.out.println("Data de entrada: " + this.dataEntrada.getFormatada());
                System.out.println("N. de identidade:" +this.rg);
                System.out.println("salario atual:" + this.salario);
                System.out.println("ganho anual:" + this.calculaGanhoAnual());
               }
        }

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 getFormatada(){
        return this.dia + "/" + this.mes +"/" + this.ano;
    }
}
class Empresa{
    Funcionario[] empregados;
    String nome;
    String cnpj;
    int contador = 0;

    void adiciona(Funcionario f){
        this.empregados[this.contador] = f;
        this.contador++;
       }
}
class TestaEmpresa{
    public static void main (String[] args) {
        Empresa empresa = new Empresa();
        empresa.empregados = new Funcionario[10];

        Funcionario f1 = new Funcionario();
        f1.salario = 1000;
        empresa.adiciona(f1);

        Funcionario f2 = new Funcionario();
        f2.salario = 1700;
        empresa.adiciona(f2);

        empresa.empregados[0].mostra();
        empresa.empregados[1].mostra();
    }
}

class Programa {

            public static void main(String[] args) {
                Funcionario f1 = new Funcionario();
                f1.nome = "Mariana";
                f1.salario = 100;
                 // adicionando a data como tipo
                f1.dataEntrada = new Data();
                f1.dataEntrada.preencheData(1, 7, 2009);

                f1.dep = "RH";
                f1.rg = "12326545656";
                f1.recebeAumento(50);

                Funcionario f2 = new Funcionario();        
                f2.nome = "Hugo";
                f2.salario = 100;


                if (f1 == f2) {
                    System.out.println("iguais");
                } else {
                    System.out.println("diferentes");        
                }
                f1.mostra();
              }
        }

Mas, quando rodei java TestaEmpresa deu a seguinte informação: Exception in thread "main" java.lang.NullPointerException at Funcionario.mostra(Funcionario.java:18) at TestaEmpresa.main(Funcionario.java:68)

Estou perdido!

3 respostas
solução!

Oi Marco, tudo bem?

Como não fiz esse curso, não sei o quanto você entende esses conceitos que eu vou falar... Então se eu não conseguir ser claro, ou você ainda não aprendeu alguma dessas coisas, deixe-me saber. :)

Como você não setou os valores de alguns atributos do objeto funcionário, eles foram iniciados com os valores padrão de cada um.

O valor padrão para objetos é null, o funcionário tem uma data que está null, como o método mostra() tem uma chamada pra:

this.dataEntrada.getFormatada()

e data é null, ele lança uma NullPointerException. Para resolver você precisa setar os atributos, similar ao que você fez na classe Programa:

Funcionario f1 = new Funcionario();
f1.nome = "Mariana";
f1.salario = 100;
// adicionando a data como tipo
 f1.dataEntrada = new Data();
 f1.dataEntrada.preencheData(1, 7, 2009);

 f1.dep = "RH";
 f1.rg = "12326545656";
 f1.recebeAumento(50);

Faz sentido? Abs.

Agora fez sentido! Obrigado!

Olá Antonio! O problema é na sua classe TestaEmpresa, pois você não está instanciando a classe Data e atribuindo o objeto para a variável de instancia da classe Funcionário.

Então quando você chama o método mostra() ele realiza o System.out.println() do objeto Data que é a variável de instancia dataEntrada da sua classe Funcionário. Mas, perceba que não existe nenhum objeto porque em nenhum momento você criou, então é lançada uma exceção, ou atribuiu a variável de instancia.

Para corrigir você deve fazer como você fez na classe Programa, criando um objeto Data e atribuindo ele ao Funcionario:

f1.dataEntrada = new Data();
f1.dataEntrada.preencheData(1, 7, 2009);

Ficando o código assim:

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

        Funcionario f1 = new Funcionario();
        f1.salario = 1000;
        f1.dataEntrada = new Data();
        f1.dataEntrada.preencheData(1, 7, 2009);
        empresa.adiciona(f1);


        Funcionario f2 = new Funcionario();
        f2.salario = 1700;
        f2.dataEntrada = new Data();
        f2.dataEntrada.preencheData(1, 7, 2009);
        empresa.adiciona(f2);

        empresa.empregados[0].mostra();
        empresa.empregados[1].mostra();
    }
}

Também é necessário fazer para o segundo funcionario na classe Programa, pois caso não faça, dará o mesmo erro.

Espero ter ajudado! Bons Estudos!