Solucionado (ver solução)
Solucionado
(ver solução)
1
resposta

NullPointerException ao tentar usar referência

Boa tarde, estou criando um projeto para aplicar o que foi aprendido nas aulas até esse ponto do curso, mas ao instânciar o objeto "Cliente" e tentar usar a referência para instânciar o endereço dentro do objeto estou tendo erro de NPE. Segue abaixo os códigos: Essa é a classe "Pessoa" que fiz para utilizar herança para herdar características para outros tipos "Pessoa". Nela pode se verificar que fiz uma referência "Endereco" onde coloco os dados de endereço.

package testeAulas;

public abstract class Pessoa {

private String nome;
private String cpf;
private int idade;
private Endereco endereco;

public String getNome() {
    return nome;
}

public void setNome(String nome) {
    this.nome = nome;
}

public String getCpf() {
    return cpf;
}

public void setCpf(String cpf) {
    this.cpf = cpf;
}

public int getIdade() {
    return idade;
}

public void setIdade(int idade) {
    this.idade = idade;
}

public Endereco getEndereco() {

    return endereco;
}

public void setEndereco(Endereco endereco) {
    this.endereco = endereco;
}

}

A classe Endereco deixei desta forma:

package testeAulas;

public class Endereco {

private String cidade;
private String rua;
private String cep;

public void setCidade(String cidade) {
    this.cidade = cidade;
}

public String getCidade() {
    return cidade;
}

public void setRua(String rua) {
    this.rua = rua;
}

public String getRua() {
    return rua;
}

public void setCep(String cep) {
    this.cep = cep;
}

public String getCep() {
    return cep;
}

Então criei uma classe "Cliente" onde usei como classe mãe a classe "Pessoa", criei um atributo só de "Cliente" que é o "dinheiro", ao instânciar este objeto na classe "Loja" que fiz para executar, ocorre tudo certo, consigo instânciar todos os atributos no objeto.

Na linha 12 do código deixei um exemplo de como estou tentando instânciar os atributos da classe "Endereco" dentro do objeto "Cliente", não da erro de compilação, mas na execução ocorre o NPE.

package testeAulas;

public class Loja {

public static void main(String[] args) {

    Cliente diego = new Cliente();
    diego.setNome("Diego Marks");
    diego.setCpf("00.111.222.33");
    diego.setIdade(24);
    diego.setDinheiro(110000.0);
    diego.getEndereco().setCidade("Capanema");



    Carro carro1 = new Carro();
    carro1.setMarca("Toyota");
    carro1.setModelo("SW4");
    carro1.setCor("Prata");
    carro1.setAno(2015);
    carro1.setPreco(120000.0);


    Carro carro2 = new Carro();
    carro2.setMarca("Ford");
    carro2.setModelo("F250");
    carro2.setCor("Azul escuro");
    carro2.setAno(2017);
    carro2.setPreco(49500.0);

    if(diego.getDinheiro() >= carro1.getPreco()) {
        System.out.println("O preço desse" + carro1.getMarca() + " esta bom, vou olhar melhor o carro.");
    }if(diego.getDinheiro() >= carro2.getPreco()){
        System.out.println("Legal, esse carro da " + carro2.getMarca() + " está com preço bom. Vou olhar o restante do veículo.");
    }
    else {
        System.out.println("Estou com pouco dinheiro, vou em olhar outro lugar");
    }

Peço desculpas pelo tamanho do tópico, mas não consigo ver o que pode estar errado, o fato é que o getEndereco() está como nulo no momento de execução, mas na minha visão estou entrando no objeto diego. e após isso "puxo" a referência "Endereco" e então estou instânciando os dados de endereço. Fico no aguardo de algum feedback, desde já sou grato.

1 resposta
solução!

Olá Diego! Tudo bem?

É muito comum surgir dúvidas e pequenos problemas como esse quando estamos praticando... é por meio deles que conseguimos aprender mais ainda!

Repare que ao criar o cliente diego em momento nenhum você criou um objeto do tipo Endereco... então o endereço do diego segue nulo.

Com o endereço nulo você tenta utilizar o método getEndereco(), que naturalmente retorna nulo. Além disso não é possível utilizar o método setCidade() atrelado ao método getEndereco(), pois como acabamos de ver, o endereço na verdade está nulo.

diego.getEndereco().setCidade("Capanema");

 

Para utilizar corretamente seria necessário instanciar um objeto do tipo Endereco e atribuir por meio do diego.setEndereco(), para que o diego use tal endereço.

Outra possibilidade seria criar um construtor na classe Cliente que tenha um Endereco em seu parâmetro, obrigando que seja dado um Endereco para o Cliente assim que o instanciamos.

Fazendo de uma dessas formas poderíamos então utilizar o getEndereco(), pois de fato teríamos preenchido com um objeto do tipo Endereco atributo do cliente diego.

Consegui te ajudar? Se ainda tiver dúvidas, é só falar!

Se achar interessante ter um material adicional para te ajudar nos estudos de orientação a objetos, recomendo a apostila da Caelum:

Caso este post tenha lhe ajudado, por favor, marcar como solucionado ✓.Bons Estudos!