9
respostas

dúvida

Olá, criei um projeto chamado cadastro. Depois criei as tres classes: class Empresa, class Endereco, class pessoa. Depois criei mais tres classes para estanciar as classes anteriores. Aparentemente o código está correto, não mostra erro nenhum em vermelho, mas na hora de compilar aparece um erro. vou compartilhar o código e cada erro que aparece.

package cadastro;

public class Pessoa {

    String nome;
    String cpf;
    int idade;
    Endereco endereco;
}
package cadastro;

public class Endereco {

    String logradouro;
    String complemento;
    String numero;
    String bairro;
    String cidade;
    String cep;

}
package cadastro;

public class Empresa {

    String razaoSocial;
    String cnpj;
    Endereco endereco;

}

até aki parece que está correto. mas na hora de compilar cada classe estanciada que foi criada em arquivos separados dá erro.

package cadastro;

public class CadastroPessoa {

    public static void main(String[] args) {

        Pessoa pessoa1 = new Pessoa();

        pessoa1.nome = "Welliton";
        pessoa1.cpf = "111.111.111-11";
        pessoa1.idade = 36;

        pessoa1.endereco.logradouro = "Avenida Dom Emanuel";
        pessoa1.endereco.complemento = "Qd. 15 Lt. 20";
        pessoa1.endereco.numero = "211";
        pessoa1.endereco.bairro = "Centro";
        pessoa1.endereco.cidade = "Senador Canedo";
        pessoa1.endereco.cep = "75.111-222";

        System.out.println(pessoa1.nome);

    }

}

aparece este erro: Exception in thread "main" java.lang.NullPointerException: Cannot assign field "logradouro" because "pessoa1.endereco" is null at cadastro/cadastro.CadastroPessoa.main(CadastroPessoa.java:13)

outra classe:

package cadastro;

public class CadastroEmpresa {

    public static void main(String[] args) {

        Empresa empresa1 = new Empresa();

        empresa1.razaoSocial = "Tend Tudo";
        empresa1.cnpj = "13.313.314/0001-13";

        empresa1.endereco.logradouro = "Rua do Comércio";

        System.out.println(empresa1.cnpj);
    }

}

neste dá este erro: Exception in thread "main" java.lang.NullPointerException: Cannot assign field "logradouro" because "empresa1.endereco" is null at cadastro/cadastro.CadastroEmpresa.main(CadastroEmpresa.java:12)

ultima classe:

package cadastro;

public class CadastroEndereco {

    public static void main(String[] args) {

        Endereco enderecoJoao = new Endereco(); 

        enderecoJoao.logradouro = "Rua Esmeraldo";
        enderecoJoao.complemento = "Qd. 11 Lt. 12";
        enderecoJoao.numero = "500";
        enderecoJoao.bairro = "Setor das Indústrias";
        enderecoJoao.cidade = "Senador Canedo";
        enderecoJoao.cep = "75.444-55";

        System.out.println(enderecoJoao.cidade);
    }


}

esta classe Endereco, compila normal ao chamar o System.out.println().

9 respostas

Bom dia Welliton.

Este modelo que você está utilizando se chama composição, onde um objeto complexo é "quebrado" em objetos menores para melhor leitura e reutilização. No caso, você tem pessoa como objeto complexo e endereço com objeto mais simples. No entanto, para construir o objeto complexo, é necessário construir os objetos que ele depende primeiro e depois associar esses objetos mais simples ao objeto complexo. Veja o exemplo abaixo:

package cadastro;

public class CadastroPessoa {

    public static void main(String[] args) {

        Endereco endereco = new Endereco();
        endereco.logradouro = "Avenida Dom Emanuel";
        endereco.complemento = "Qd. 15 Lt. 20";
        endereco.numero = "211";
        endereco.bairro = "Centro";
        endereco.cidade = "Senador Canedo";
        endereco.cep = "75.111-222"; 

        Pessoa pessoa = new Pessoa();

        pessoa.endereco = endereco;
        pessoa.nome = "Welliton";
        pessoa.cpf = "111.111.111-11";
        pessoa.idade = 36;

        System.out.println("Nome: " + pessoa.nome + "\n" +
                "Endereco: " + pessoa.endereco.logradouro);

    }

}

Olha se meu racicionio está correto. Entao ao inves de eu instaciar na classe Pessoa, o endereço de pessoa1, eu instacio na classe Endereco e faço a relação entre pessoa1 e endereco? Seria mais ou menos isso. Até porque se eu for criar os endereços junto com o instanciamento de pessoa1, por exemplo, não precisaria ter criado a classe separado de Endereco. Não sei se está correto o meu raciocinio.

Boa tarde Welliton.

Seu entendimento está correto e na verdade é uma boa prática segregar as entidades para melhor visualização e reusabilidade. A questão da complexidade sobre a criação deste tipo de objeto é atenuada com uso do Pattern Builder e tem até um curso na Alura que o aborda: https://cursos.alura.com.br/course/design-patterns/task/278. Continue assim :)

Bons estudos!!

Muito obrigado.

boa tarde, tentei fazer novamente mas nao ta rodando.

package cadastro;

public class Pessoa {

    String nome;
    String cpf;
    int idade;
    Endereco endereco;
}
package cadastro;

public class Empresa {

    String razaoSocial;
    String cnpj;
    Endereco endereco;

}
package cadastro;

public class Endereco {

    String logradouro;
    String complemento;
    String numero;
    String bairro;
    String cidade;
    String cep;

}
package cadastro;

public class CadastroPessoa {

    public static void main(String[] args) {

        Pessoa pessoa1= new Pessoa();

        pessoa1.endereco = enderecoJoao;

        pessoa1.nome = "João";
        pessoa1.cpf = "111.111.111-11";
        pessoa1.idade = 36;




        System.out.println(pessoa1.nome);

    }

}
package cadastro;

public class CadastroEmpresa {

    public static void main(String[] args) {

        Empresa empresa1 = new Empresa();

        empresa1.razaoSocial = "Tend Tudo";
        empresa1.cnpj = "13.313.314/0001-13";

        empresa1.endereco = enderecoJoao;

        System.out.println(empresa1.cnpj);
    }

}
package cadastro;

public class CadastroEndereco {

    public static void main(String[] args) {

        Endereco enderecoJoao = new Endereco(); 

        enderecoJoao.logradouro = "Rua Esmeraldo";
        enderecoJoao.complemento = "Qd. 11 Lt. 12";
        enderecoJoao.numero = "500";
        enderecoJoao.bairro = "Setor das Indústrias";
        enderecoJoao.cidade = "Senador Canedo";
        enderecoJoao.cep = "75.444-55";

        System.out.println(enderecoJoao.cidade);
    }


}


Acho que nao estou acertando em chamar a referencia endereco, pois nao compila em CadastroPessoa e nem CadastroEmpresa.

ao compilar CadastroPessoa aparece este erro: Exception in thread "main" java.lang.Error: Unresolved compilation problem: enderecoJoao cannot be resolved to a variable at cadastro/cadastro.CadastroPessoa.main(CadastroPessoa.java:9)

ao compilar CadastroEmpresa aprece este erro: Exception in thread "main" java.lang.Error: Unresolved compilation problem: enderecoJoao cannot be resolved to a variable at cadastro/cadastro.CadastroEmpresa.main(CadastroEmpresa.java:12)

Não sei se o erro foi porque eu criei uma classe de cadastro para cada item seperado, como class CadastroPessoa, CadastroEmpresa e CadastroEndereco, e aí eu estanciei as classes de cadastros em arquivos diferentes...

Quando eu criei a classe TestaCadastro e instaciei tudo neste mesmo arquivo, compilou corretamente.

package cadastro;

public class TestaCadastro {
    public static void main(String[] args) {
        Pessoa pessoa1 = new Pessoa();
        pessoa1.nome = "João";
        pessoa1.cpf = "111.111.111-11";
        pessoa1.idade = 30;


        Empresa empresa1 = new Empresa();
        empresa1.razaoSocial = "Brasil S/A";
        empresa1.cnpj = "11.111-0001/00";



        Endereco endereco1 = new Endereco();
        endereco1.logradouro = "rua 15";
        endereco1.complemento = "qd. 1 lt. 2";
        endereco1.numero = "1313";
        endereco1.bairro = "centro";
        endereco1.cidade = "Florianópolis";
        endereco1.cep = "78.888-252";
        System.out.println(endereco1.cidade);

        pessoa1.endereco = endereco1;
        empresa1.endereco = endereco1;
        System.out.println(pessoa1.nome);
        System.out.println(pessoa1.cpf);
        System.out.println(pessoa1.idade);
        System.out.println(pessoa1.endereco.logradouro);
        System.out.println(empresa1.endereco.logradouro);

Bom dia Welliton.

Ao deixar em classes separadas, não funciona pois são essencialmente programas diferentes e não possuem acesso aos objetos uns dos outros. O ideal é que rode tudo no mesmo programa, como você fez no último post, assim os objetos podem ser acessados e associados.

Bons estudos!!

obrigado