Ir ao conteúdo

Java Java: Problema com vetor de objetos


Ir à solução Resolvido por AdrianoSiqueira,

Posts recomendados

Postado

Quando na main vou chamar os métodos da classe Pessoa11 através de um vetor pessoas que se encontra na classe Vetor11, ocorre o erro java.lang.NullPointerException;

Quando um vetor de objetos é criados eles são "inicializados" como null, eu criei um código que deveria preencher esse vetor, mas parece que não funcionou.

 

Essa é a classe Vetor11 que cria o vetor de pessoas.

 

public class Vetor11 {
    private Pessoa11 pessoas[] = new Pessoa11[100];
    
    //adiciona aluno
    public void adicionaPessoa(Pessoa11 pessoa){
        for(int i = 0; i < pessoas.length;i++){
            if(pessoas[i] == null){
               pessoas[i] = pessoa;
               break;
            }
        }
    }
    
    public Pessoa11 getPessoa(int pos) {//retorna os objetos
    	return pessoas[pos];
    }
    

Essa abaixo se encontra na classe principal. Cheguei a pensar que o problema estaria no método adicionarPessoa que pede uma pessoa e recebe um vetor de pessoas, alterei o que sabia e continuou sem funcionar

 

//Maneira 1: Classe principal
Pessoa11 pessoa[] = new Pessoa11[numbers];
			
			for (int i = 0; i < pessoa.length; i++) 
				v1.adicionaPessoa(pessoa[i);
			// Preenche o vetor
                                         
//Maneira 2: Classe principal
Pessoa11 pessoa[] = new Pessoa11[numbers];
			Pessoa11 nada = new Pessoa11();
			for (int i = 0; i < pessoa.length; i++) {
				nada = pessoa[i];
				v1.adicionaPessoa(nada);
			}
			// Preenche o vetor

Logo na primeira linha em que tento usar um método da classe Pessoa11 acontece esse erro

for (int i = 0; i < numbers; i++) {
				int n = i + 1;

				while (i < numbers) {
					System.out.printf("Digite o nome da pessoa %d:\n", n);

					String stri = scan.nextLine();
					if (eString(stri)) {
						v1.getPessoa(i).setNome(stri);//Exception in thread "main" java.lang.NullPointerException
						break;
					} else
						System.out.println("O nome deve conter apenas caracteres alfabéticos!!");

				}
			}

 

Postado

Aparentemente seu problema realmente é com a inicialização dos objetos. Um vetor é um objeto, logo o Java inicializa ele como null. Cada elemento desse vetor, no caso Pessoa11, também é um objeto, logo cada uma das posições do vetor é inicializada como null, mas apenas depois de inicializado o vetor. Ou seja, você tem que instanciar o vetor, depois percorrer cada uma de suas posições instanciando todas as pessoas, por exemplo com um construtor vazio.

 

O NullPointerException está acontecendo porque você está chamando o setNome de um objeto que é null.

 

Analise o exemplo, modifique para sua necessidade e vê se resolve.

public class Pessoa {
    private String nome;

    public Pessoa() {
        this.nome = "";
    }

    public Pessoa(String nome) {
        this.nome = nome;
    }

    public String getNome() {
        return nome;
    }

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

    @Override
    public String toString() {
        return "Pessoa{" +
                "nome='" + nome + '\'' +
                '}';
    }
}
public class Lista {
    private Pessoa[] pessoas;
    private int posicaoAtual;   // Usado para adicionar pessoas

    public Lista() {
        this.pessoas = new Pessoa[10];  // Instancia o vetor
        for (int i = 0; i < this.pessoas.length; ++i)
            pessoas[i] = new Pessoa();  // Instancia cada elemento do vetor

        this.posicaoAtual = 0;
    }

    public void adicionar(Pessoa novo) {
        pessoas[posicaoAtual] = novo;
        ++posicaoAtual;
    }

    public Pessoa getPessoa(int posicao) {
        return pessoas[posicao];
    }

    public Pessoa[] getPessoas() {
        return pessoas;
    }
}
public class Principal {
    public static void main(String[] args) {
        Lista lista = new Lista();

        Pessoa p1 = new Pessoa("P1");
        Pessoa p2 = new Pessoa("P2");
        Pessoa p3 = new Pessoa("P3");
        Pessoa p4 = new Pessoa("P4");
        Pessoa p5 = new Pessoa("P5");
        Pessoa p6 = new Pessoa("P6");

        lista.adicionar(p1);
        lista.adicionar(p2);
        lista.adicionar(p3);
        lista.adicionar(p4);
        lista.adicionar(p5);
        lista.adicionar(p6);

        System.out.println("-------------------------");
        for (Pessoa pessoa : lista.getPessoas())
            System.out.println(pessoa);
        System.out.println("-------------------------");

        System.out.println();
        System.out.println(">> Modificando posição 2");
        lista.getPessoa(2).setNome("Novo nome");
        System.out.println();

        System.out.println("-------------------------");
        for (Pessoa pessoa : lista.getPessoas())
            System.out.println(pessoa);
        System.out.println("-------------------------");
    }
}

 

  • Curtir 1
Postado

Era o que eu temia. (Preencher um vetor null com outro vetor null não funcionou)

Nesse código o usuário precisa digitar a quantidade de pessoas que serão analisadas, de acordo com o valor fornecido serão criados os objetos Pessoa11.

//Maneira 1: Classe principal
Pessoa11 pessoa[] = new Pessoa11[numbers]; //numbers é fornecido pelo usuário
			
			for (int i = 0; i < pessoa.length; i++) 
				v1.adicionaPessoa(pessoa[i);
			// Preenche o vetor

Aparentemente eu teria que instanciar uma quantidade x de objetos e deixá-los disponíveis para o usuário.

Tipo criar 100 objetos pessoas, porém o usuário deverá pedi para analisar menos de 100 pessoas.

 

Creio que essa não é a forma correta de fazer isso, e também não consegui pensar em um método que instancie X objetos.

  • Solução
Postado

Seria algo assim?

System.out.print("Quantidade de pessoas: ");
int quantidade = scanner.nextInt();

// Instancia o vetor com o tamanho que o usuário escolher
Pessoa11 pessoas[] = new Pessoa11[quantidade];

// Instancia cada um dos elementos do vetor
for(int i = 0; i < pessoas.length; ++i) {
  	pessoas[i] = new Pessoa11();
}

Nesse caso o vetor teria o tamanho que o usuário escolher, e com todos os elementos devidamente instanciados.

Postado

Resolveu, eu pensava que para instanciar um objeto eu necessariamente precisava dar um nome para ele.

Pensava que algo assim não rodaria.

// Instancia cada um dos elementos do vetor
for(int i = 0; i < pessoas.length; ++i) {
  	pessoas[i] = new Pessoa11();
}

 

Crie uma conta ou entre para comentar

Você precisa ser um usuário para fazer um comentário

Criar uma conta

Crie uma nova conta em nossa comunidade. É fácil!

Crie uma nova conta

Entrar

Já tem uma conta? Faça o login.

Entrar agora

Sobre o Clube do Hardware

No ar desde 1996, o Clube do Hardware é uma das maiores, mais antigas e mais respeitadas comunidades sobre tecnologia do Brasil. Leia mais

Direitos autorais

Não permitimos a cópia ou reprodução do conteúdo do nosso site, fórum, newsletters e redes sociais, mesmo citando-se a fonte. Leia mais

×
×
  • Criar novo...