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

Nulo Pointer exception

E ai pessoal, tudo bem com vocês?

Podem me ajudar em uma dúvida aqui? Estou treinando o envolvimento de classes, inserindo uma na outra (inclusive umas delas possui Array) etc. Acontece que criei uma classe Data dataNascimento e criei dois comportamentos, quando declaro os parâmetros desse comportamento na minha classe main, compilo e executo a main, aparece um erro de Null Pointer Exception. O problema que não consigo ver o que estou fazendo de errado, pois o caminho parece claro e o comportamento também. Alguém me sugere alguma coisa ou pode me mostrar o erro? Sei que deve ser algo bem óbvio e bobo, mas sou muito leigo e estou tentando aprender o máximo que posso. Obrigado!

class Casa {
    String endereco;
    String numero;
    String bairro; 
    Residente[] morador;

    void imprimeMoradores () {

        for(int i = 0; i < this.morador.length; i++){
            Residente residente = this.morador[i];
            Data data = this.morador[i].dataNascimento;
            if(residente == null) continue;
            System.out.println("\n" + "O morador " + residente.nome + 
            " de idade " + residente.idade + " e de CPF " + residente.cpf +
            " e de salário " + residente.salario + ", residente no endereço " +
            this.endereco + " de número " + this.numero + " do bairro " +
            this.bairro + ". Este residente recebe um saláro anual de " +
            residente.calculaGanhoAnual() + "\n" + data.mostraData());
        }

    }
}

class Residente {
    String nome;
    int idade;
    Data dataNascimento;
    String cpf;
    double salario;

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

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 mostraData(){
        return this.dia + "/" + this.mes + "/" + this.ano;
    }
}

class TestaCasa{
    public static void main(String [] args){
        Casa c1 = new Casa();
        c1.morador = new Residente[10];

        c1.endereco = "Av Miguel Perrela";
        c1.numero = "115";
        c1.bairro = "Castelo";

        c1.morador[0] = new Residente();
        c1.morador[0].nome = "Diego";
        c1.morador[0].idade = 27;
        c1.morador[0].dataNascimento.preencheData(28, 01, 1991);
        c1.morador[0].cpf = "123";
        c1.morador[0].salario = 3500.0;

        c1.morador[1] = new Residente();
        c1.morador[1].nome = "Jéssica";
        c1.morador[1].idade = 29;
        c1.morador[1].dataNascimento.preencheData(13, 11, 1988);
        c1.morador[1].cpf = "456";
        c1.morador[1].salario = 3500.00;

        c1.imprimeMoradores();


    }
}
3 respostas

Oi Diego, está faltando você criar a dataNascimento, ela é um objeto do Data porém você não está dando new nela. Outro ponto que eu tenho para te falar é o imprimeMoradores, você está mandando imprimir tudo, mas você criou um array de 10 residentes e nesse array você ocupa somente 2 posições (Diego e Jéssica), depois que imprimir a Jéssica ele vai estourar pois irá tentar imprimir um terceiro morador que não existe.

solução!

Fala ai Diego, de boa ?

Cara é bem pequeno seu erro.

Cara quando você está tentando dar a data de nascimento para seus moradores está levando a exceção.

Dá uma olhadinha :

c1.morador[0].dataNascimento.preencheData(28, 01, 1991);

Você está pegando seu residente e chamando o atributo dataNascimento que é um objeto do tipo Data que por padrão é nulo ai você está querendo chamar o método preencheData em uma referencia nula, ai é gerada a exception.

Para resolver você precisa ter uma instância desse seu objeto antes :

c1.morador[0].dataNascimento = new Data();
c1.morador[0].dataNascimento.preencheData(28, 01, 1991);

Obrigado Joel e Matheus. Eu tinha a impressão que era algo "besta" mas não conseguia ver o problema. Acho que foquei tanto nas referências a objetos que acabei esquecendo de criá-las em minha main. De toda forma muito obrigado pela ajuda.