Meu Iterator não Imprime

Boa noite.

Estou com um problema em um exercício da faculdade, eu simplesmente não consigo de jeito nenhum fazer o programa imprimir uma coleção com o Interator, é como se não ouvesse o Sysout ou a coleção, não consigo achar o erro no programa.

Segue o código da Classe de Controle: (se necessário eu posto o projeto inteiro com as Classes de Domínio)

public class Programa {

public static void main(String[] args) {
	Scanner leia = new Scanner(System.in);

	System.out.println("CADASTRO DE CLIENTES");

	System.out.print("Digite o CPF: ");
	String cpf = leia.nextLine();
	System.out.print("Digite o nome: ");
	String nome = leia.nextLine();
	System.out.print("Digite o endereço: ");
	String end = leia.nextLine();
	System.out.print("Digite o telefone: ");
	String tel = leia.nextLine();

	Cliente cli = new Cliente(cpf, nome, end, tel);

	System.out.println("\nCADASTRO DE ANIMAIS");

	ArrayList<Animal> listaPets = new ArrayList<Animal>();

	char resposta = 'S';

	do {
		System.out.print("Digite o nome: ");
		String nomeA = leia.next();
		System.out.print("Digite a espécie: ");
		String espec = leia.next();
		System.out.print("Digite a raça: ");
		String raca = leia.next();
		System.out.print("Digite o ano de nascimento: ");
		int anoNasc = leia.nextInt();
		System.out.print("Digite o sexo: ");
		char sexo = leia.next().charAt(0);

		Animal pet = new Animal(nomeA, espec, raca, anoNasc, sexo);
		cli.addAnimal(pet);

		System.out.print("Deseja Continuar? <S/N>: ");
		resposta = leia.next().charAt(0);

	} while (resposta == 's');

	System.out.println("Lista de Pets do(a) Cliente " + cli.getNome());

	Iterator<Animal> it = listaPets.iterator();
	while (it.hasNext()) {
		Animal pet = it.next();
		System.out
				.println(pet.getNome() + pet.getEspecie() + pet.getRaca() + pet.getAnoNascimento() + pet.getSexo());

	}

}

}

Desde já, obrigado.

A lista é criada mas depois nunca é adicionado nenhum valor lá.

Eu estou adicionando os valores pelo console executando o programa no Eclipse

Não está não, ou postou o código errado.

Você itera uma lista chamada listaPets, mostra pra gente em qual linha você está inserindo algo nessa listaPets.
:wink:

Sua char tem valor ‘S’, e o parâmetro do while compara com o valor ‘s’, não é por isso?

Como eu falei, eu costumo inserir pelo console do Eclipse, vou tentar inserir dentro do programa para vocês poderem ver melhor, uma dúvida, eu vou precisar povoar o objeto do cliente ou se eu só fizer a lista funciona?

public class Programa {

public static void main(String[] args) {
	Scanner leia = new Scanner(System.in);

	/*
	 * System.out.println("CADASTRO DE CLIENTES");
	 * 
	 * System.out.print("Digite o CPF: "); String cpf = leia.nextLine();
	 * System.out.print("Digite o nome: "); String nome = leia.nextLine();
	 * System.out.print("Digite o endereço: "); String end =
	 * leia.nextLine(); System.out.print("Digite o telefone: "); String tel
	 * = leia.nextLine();
	 */

	Cliente cli = new Cliente("001", "José", "Rua A", "2772-3595");

	// System.out.println("\nCADASTRO DE ANIMAIS");

	ArrayList<Animal> listaPets = new ArrayList<Animal>();

	listaPets.add(new Animal("Tom", "Cão", "Pastor", 2010, 'm'));
	listaPets.add(new Animal("Luna", "Gato", "Siames", 2015, 'f'));

	/*
	 * char resposta = 's';
	 * 
	 * do { System.out.print("Digite o nome: "); String nomeA = leia.next();
	 * System.out.print("Digite a espécie: "); String espec = leia.next();
	 * System.out.print("Digite a raça: "); String raca = leia.next();
	 * System.out.print("Digite o ano de nascimento: "); int anoNasc =
	 * leia.nextInt(); System.out.print("Digite o sexo: "); char sexo =
	 * leia.next().charAt(0);
	 * 
	 * Animal pet = new Animal(nomeA, espec, raca, anoNasc, sexo);
	 * cli.addAnimal(pet);
	 * 
	 * System.out.print("Deseja Continuar? <s/n>: "); resposta =
	 * leia.next().charAt(0);
	 * 
	 * } while (resposta == 's');
	 */

	System.out.println("Lista de Pets do(a) Cliente " + cli.getNome());

	Iterator<Animal> it = listaPets.iterator();
	while (it.hasNext()) {
		Animal animalTemp = (Animal) it.next();
		System.out.println(animalTemp.getNome() + " - " + animalTemp.getEspecie() + " - " + animalTemp.getRaca()
				+ " - " + animalTemp.getAnoNascimento() + " - " + animalTemp.getSexo());

	}

}

}

Alterei o meu código para ao invés do usuário fazer a inclusão, eu mesmo inclui os dados do objeto e das coleções, agora o programa funcionou e me retornou as coleções.

A questão é que para esse exercício eu preciso que o usuário dê a entrada nos dados, como o programa não funcionou antes significa que a minha entrada de dados está com algum erro?

Eu estava tendo é um InputMismatchException quando eu digitava “Pastor Alemão” na raça antes, pelo console do Eclipse, eu li na net que é como se ao dar Enter ele jogasse um espaço para o campo Data de Nascimento que é INT, mas não consegui resolver esse erro, ao digitar somente “Pastor”, o programa ia normalmente.

Nessa Parte:

		  do { 
	  System.out.print("Digite o nome: "); 
	  String nomeA = leia.next();
	  System.out.print("Digite a espécie: "); 
	  String espec = leia.next();		  
	  System.out.print("Digite a raça: "); //Aqui
	  String raca = leia.next();		  
	  System.out.print("Digite o ano de nascimento: "); 
	  int anoNasc = leia.nextInt(); 		  
	  System.out.print("Digite o sexo: "); 
	  char sexo = leia.next().charAt(0);
	  
	  Animal pet = new Animal(nomeA, espec, raca, anoNasc, sexo);
	  cli.addAnimal(pet);
	  
	  System.out.print("Deseja Continuar? <s/n>: "); 
	  resposta = leia.next().charAt(0);
	  
	 } while (resposta == 's');

Consegues perceber a diferença?

1 curtida

Sim, tive que fazer essa alteração para o programa funcionar, essa parte ficou assim no código atualizado:

listaPets.add(new Animal(nomeA, espec, raca, anoNasc, sexo));

Eu só não entendi porque nos exemplos de aula o meu professor faz assim:

Parto parto = new Parto(data, hora);
		med.addParto(parto);

Porque nesse caso a tua lista deve estar dentro de Parto e não na classe principal.

Volta ao teu exemplo inicial e elimina a linha que cria a listaPets do main e tenta por a funcionar apenas com a lista dentro de Cliente.

Alterei, fica dando erro no Iterator mesmo com a Classe Cliente importada:

Iterator<Animal> it = listaAnimais.iterator();
	while (it.hasNext()) {
		Animal animalTemp = (Animal) it.next();
		System.out.println(animalTemp.getNome() + " - " + animalTemp.getEspecie() + " - " + animalTemp.getRaca()
				+ " - " + animalTemp.getAnoNascimento() + " - " + animalTemp.getSexo());

	}
}

O Eclipse diz que listaAnimais não pode ser entendido/resolved como um tipo/type.

Segue o código da Classe de Domínio:

package dominio;

import java.util.ArrayList;

public class Cliente {
private String cpf, nome, endereco, telefone;
private ArrayList listaAnimais;// Relacionamento n-ário

public Cliente(String cpf, String nome, String endereco, String telefone) {
	this.cpf = cpf;
	this.nome = nome;
	this.endereco = endereco;
	this.telefone = telefone;
	listaAnimais = new ArrayList<Animal>();
}

public String getCpf() {
	return cpf;
}

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

public String getNome() {
	return nome;
}

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

public String getEndereco() {
	return endereco;
}

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

public String getTelefone() {
	return telefone;
}

public void setTelefone(String telefone) {
	this.telefone = telefone;
}

public void addAnimal(Animal novoAnimal) {

	if (listaAnimais.contains(novoAnimal))
		return;
	else {
		listaAnimais.add(novoAnimal);
		novoAnimal.setCliente(this);
	}

}

public void removeAnimal(Animal exAnimal) {

	if (!listaAnimais.contains(exAnimal))
		return;
	else {
		listaAnimais.remove(exAnimal);
		exAnimal.setCliente(null);
	}

}

}

package dominio;

public class Animal {
private String nome, especie, raca;
private int anoNascimento;
private char sexo;
private Cliente cliente; // Relacionamento unário

public Animal(String nome, String especie, String raca, int anoNascimento, char sexo) {
	this.nome = nome;
	this.especie = especie;
	this.raca = raca;
	this.anoNascimento = anoNascimento;
	this.sexo = sexo;
}

public String getNome() {
	return nome;
}

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

public String getEspecie() {
	return especie;
}

public void setEspecie(String especie) {
	this.especie = especie;
}

public String getRaca() {
	return raca;
}

public void setRaca(String raca) {
	this.raca = raca;
}

public int getAnoNascimento() {
	return anoNascimento;
}

public void setAnoNascimento(int anoNascimento) {
	this.anoNascimento = anoNascimento;
}

public char getSexo() {
	return sexo;
}

public void setSexo(char sexo) {
	this.sexo = sexo;
}

public void setCliente(Cliente cliente) {
	this.cliente = cliente;
}

}

A lista de animais está no cliente, não no main…

Fiz a alteração, mas o Eclipse está falando que a lista não é visível, eu devo alterar a visibilidade da lista no Cliente para pública? Não deveria ficar como privada já que é como se fosse um atributo de Cliente?

Crias um get tal como tens nos restantes atributos privados.

Ainda não entendi, eu tenho o get da lista dentro do print lá embaixo.

Você está adicionando os animais no objeto cli e não no objeto listaPets.
Ou você cria na classe do objeto cli um método para obter cada animal ou a lista inteira, ou então adicione os animais no objeto listaPets.

Mas o Cliente possui o método para adicionar animais.

public void addAnimal(Animal novoAnimal) {

if (listaAnimais.contains(novoAnimal))
	return;
else {
	listaAnimais.add(novoAnimal);
	novoAnimal.setCliente(this);
}

Sim amigo, você tem o método pra adicionar na “listaAnimais” dentro de Cliente, mas o objeto que você está usando se chama "listaPets"e está em outra classe, listaAnimais e listaPets são listas diferentes… onde vc preenche a “listaPets” com as informações da “listaAnimais”?

Pra isso ai dar certo você teria que fazer algo do tipo:

List<Animais> listaPets = cliente.getListaAnimais();

Ou seja pegar a lista que esta armazenada dentro do seu cliente e não em uma nova lista que não tem nada e que vc acabou de criar desse jeito, aqui realmente não terá nada até que vc coloque algo:

List<Animais> listaPets = new ArrayList<>();

Algo que você esta comendo mosca neste caso é que objetos diferentes com o mesmo nome não necessariamente tem o mesmo conteúdo, afinal são objetos diferentes… por exemplo:

System.out.println(carro1.cor()); //imprime vermelho
System.out.println(carro2.cor()); //imprime azul

String cor = "rosa";

System.out.println(cor); //imprime rosa

cor = carro1.cor();

System.out.println(cor); //imprime vermelho

Ou seja não é só porque você colocou um nome numa lista ela automaticamente será preenchida com os dados de um lista que está em outro lugar…

1 curtida