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

Falha ao chamar o método

Galera,

Desculpa pelo tamanho do código, admito que se transformou em um código frankstein rsrsrs. Mas vou tentar ser objetivo na minha dúvida. Basicamente tenho 3 classes, Empresa, Funcionario e Data.

Ao tentar chamar o método preencherData, pelo código abaixo: empresa.dataEntrada.preencherData(10, 3, 2016);

Ocorre erro de java.lang.NullPointerException. Só funcionou depois que defini o empresa.dataEntrada como uma variavel e chamando o construtor Data();

empresa.dataEntrada = new Data();

A minha dúvida é justamente essa. Se o dataEntrada ja é uma variavel do tipo Data dentro da classe empresa, pq tive que chamar o construtor novamente ?

package Exercícios;

class Empresa{
   private String nome;
   int cnpj;
   public Funcionario[] funcionarios;
   private int livre = 0;
   public Data dataEntrada;

   public void statusArray(){
        int simNull = 0;
        int naoNull = 0;

        for(int i = 0; i < this.funcionarios.length; i++){        
            if(this.funcionarios[i].getNome() == null){
               simNull++;
           }else{
               naoNull++;
           }
        }           

        System.out.println("Funcionarios criados: " + naoNull);
        System.out.println("Posições livres: " + simNull);
        System.out.println("Total de Posições: " + this.funcionarios.length);

   }

   public void setArray(int x){
        this.funcionarios = new Funcionario[x];
    }

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

   public boolean contem(Funcionario f){
           for(int i = 0; i < this.livre; i++){
            if( this.funcionarios[i] == f){
              return true;             
            }
           }
        return false;
        }

   public void novoFuncionario(String nome, int salario){
       this.funcionarios[livre].setDados(nome, salario);
       livre++;
   }
}

class Funcionario{
    private String nome;
    private String departamento;
    double salario;
    private int RG;    
    Data dataDeEntrada;
    private int id;
    private static int identificador = 1;

    public double getSalario(){
        return this.salario;
    }

    public void setDados(String n, int s){
        this.nome = n;
        this.salario = s; 
        this.id = identificador;
        identificador++;
    }

}

class Data{
    int dia;
    int mes;
    int ano;

        public void preencherData(int dia, int mes, int ano){
            if(dia >= 29 && mes == 2){
                this.dia = 29;
                this.mes = 2;
                this.ano = ano;
            }else if(dia >= 31 && (mes == 1 || mes == 3 || mes == 5 || mes == 7 || mes == 8 || mes == 10 || mes == 12)){
                this.dia = 31;
                this.mes = mes;
                this.ano = ano;
            }else if(dia >= 30 && (mes == 4 || mes == 6 || mes == 9 || mes == 11)){
                this.dia = 30;
                this.mes = mes;
                this.ano = ano;
            }else{
                this.dia = dia;
                this.mes = mes;
                this.ano = ano;
            }
        }

        String getFormatada() {
        return this.dia + "/" + this.mes + "/" + this.ano;

        }
}

class TestaEmpresa{
    public static void main(String[] args){

        empresa.dataEntrada = new Data();

        empresa.dataEntrada.preencherData(10, 3, 2016);
        System.out.println(empresa.dataEntrada.getFormatada());        

    }
}
4 respostas

Galera, parando para analisar. Acho que entendi o porque. Por mais que eu tenha definido o dataEntrada como variavel do tipo Data na classe empresa, em nenhum momento eu chamei o construtor informando que é uma nova data. Uma coisa não tem nada haver com a outra. Então em vez de criar empresa.dataEntrada = new Data(); dentro da classe main, defini dentro da classe empresa o public Data dataEntrada = new Data(). Desta forma acho que esta melhor, pois sempre será uma nova. Certo ?

solução!

Data não é um tipo primitivo . Vc criou uma classe Data com atributos dentro dela, então caso vc queira criar algo com uma nova data vc deve instanciar uma nova Data (new Data() ). Como uma nova Data não foi instanciada em momento algum, o método "preencheData" não tem uma Data para preencher.

Uma coisa que vc pode fazer é, na classe Empresa já colocar um construtor:

class Empresa{
    //outros métodos e argumentos.

    public Data dataEntrada = new Data();
}

Dessa forma, sempre que uma nova empresa for instanciada, uma nova data será instanciada para ela tbm.

(Obs.: Se eu não me engano nessa série de exercícios somente "Funcionarios" devem ter DataDeEntrada)

Oi Vitor,

Me parece que você esqueceu de instanciar o objeto empresa, no método main.

Além disso, todos os objetos que não são setados num construtor são setados para valores padrão. Os tipos nativos são setados para 0 ou false. Qualquer outro objeto é setado para null, o que explica o erro quando você tenta acessar seus atributos. É comum instanciar atributos já na declaração para evitar esse comportamento, principalmente listas.

Vlw Galera !!!