Lista. Retorno de objeto

12 respostas
guj1

Olá pessoal.

Eu tenho uma lista de alunos e um método para consultar um aluno da lista, usei o foreach para percorrer a lista e retornar um objeto pesquisado, usei o return nomeDoObjeto. Só não deu certo.
No caso não retorna nada.

public AlunoAcademia consultaAluno() {
		Scanner pega = new Scanner(System.in);
		System.out.println("Informe o cpf ou o nome do aluno: ");
		String dado = pega.next();
		pega.reset();
		for (AlunoAcademia aluno : this.alunosAcademia) {
			if (aluno.getCpf().equalsIgnoreCase(dado)|| aluno.getNome().equalsIgnoreCase(dado)) {
				return aluno;
			}
		}
		return null;
	}

onde estou errado?
grato pela atenção.

12 Respostas

cido18

olá guj1,

Se não está retornando nada, então sua lista está vindo vazia, na sua classe como você esta populando ela ???

ViniGodoy

Que jeito esquisito de ler do Scanner é esse? Não era mais fácil só usar o nextLine(), como é recomendado quando se usa o console?

MarkKnopfler

ViniGodoy escreveu:

Que jeito esquisito de ler do Scanner é esse? Não era mais fácil só usar o nextLine(), como é recomendado quando se usa o console?

cido18 escreveu:

Se não está retornando nada, então sua lista está vindo vazia, na sua classe como você esta populando ela ???

Pois é, dá um System.err.println( … ) na variável dado e em aluno.getNome() e alugno.getCpf(), alguma informação deve estar vazia mesmo (ou a lista ou a String do teclado)

guj1

[quote=MarkKnopfler]

ViniGodoy escreveu:
Pois é, dá um System.err.println( … ) na variável dado e em aluno.getNome() e alugno.getCpf(), alguma informação deve estar vazia mesmo (ou a lista ou a String do teclado)

Perdão pela demora, provas da faculdade finalizadas.

Bom eu fiz o que vc pediu e retornou: snv_desenv.AlunoAcademia@adb24

Na verdade, antes de vc responder isso, uma pergunta. Eu posso fazer isso neh?
Varrer uma lista e pedir para imprimir todos os dados de uma vez dando um sysout(posicaoLista)?

código corrigido:

//Consulta um determinado aluno com o cpf informado pelo usuário.
	public void consultaAluno() {
		System.out.println("Informe o cpf do aluno: ");
		String dado = this.pega.nextLine();
		this.pega.reset();
		for (AlunoAcademia aluno : this.alunosAcademia) {
			if (aluno.getCpf().equalsIgnoreCase(dado)|| aluno.getNome().equalsIgnoreCase(dado)) {
				System.out.println(aluno);
			}
		}
	}

Grato.

ViniGodoy

Você pode sim. Mas tem que ter certeza que a lista não está vazia.

Imprime aí o valor de this.alunosAcademia.size();

guj1

ViniGodoy:
Você pode sim. Mas tem que ter certeza que a lista não está vazia.

Imprime aí o valor de this.alunosAcademia.size();

Eu fiz o seguinte teste.

Adicionei um validador para dizer se a lista está vazia ou não. E dá certo, quando a lista está vazia ele dá a mensagem "A lista estã vazia". Daí eu adicionei um aluno, e tentei consultar e dá o mesmo erro que citei acima.

Eu alterei o código e deixei como abaixo, está certo, já que cada método só pode ter um return? Eu posso fazer isso?

//Consulta um determinado aluno com o cpf informado pelo usuário.
	public AlunoAcademia consultaAluno() {
		while (this.validador) {
			if (alunosAcademia.size() > 0) {
			System.out.println("Informe o cpf do aluno: ");
			String dado = this.pega.nextLine();
			this.pega.reset();
			for (AlunoAcademia aluno : this.alunosAcademia) {
				if (aluno.getCpf().equalsIgnoreCase(dado)) {
					return aluno;
					//System.out.println(aluno);
				}
			}
			break;
			} else {
				System.out.println("A lista está vazia.");
				break;
			}
		}
		return null;
	}
guj1

Vinigodoy

Não é duplicação de tópico. Eu tratei de dúvidas diferentes em partes diferentes do meu código.

A dúvida lá é: eu desejo saber por que for é ignorado, aqui é o returno de todos os atributos de um objeto.
Diferentes não?
Você poderia desbloquear, a não quer vc queira que eu questione a outra dúvida aqui? Eu acho que é musturuar muitas duvidas em um tópico.

ViniGodoy

Você tem certeza que o dado tem o CPF de um aluno?

Tanto o erro desse tópico, quanto do outro, são facilmente resolvidos com o uso de um depurador. Por que você não usa?

Já desbloqueei o outro tópico.

guj1

ViniGodoy:
Você tem certeza que o dado tem o CPF de um aluno?

Tanto o erro desse tópico, quanto do outro, são facilmente resolvidos com o uso de um depurador. Por que você não usa?

Já desbloqueei o outro tópico.

Obrigado.

Ainda não sei usar um depurador.
Estou estudando o livro do Eclipse. Vou ver logo o capítulo de deputação e também procurar tutoriais na www pra aprender.

Vou tentar resolver com depuração depois que aprender.

Grato!

ViniGodoy

Aprenda o mais rápido possível. Tem vídeos na internet explicando.

Mas basicamente, é assim:

  1. Clique duas vezes na barra lateral branca do lado do código, ao lado da linha que você quer inspecionar. O eclipse colocará lá uma bolinha.
  2. Rode o programa em modo de depuração (o ícone no eclipse é um inseto);
  3. O eclipse irá parar na linha indicada. Você pode colocar o mouse sobre uma variável para ver seu valor. Ou selecionada e pressionar CTRL+SHIFT+I;
  4. Você pode rodar o programa passo-a-passo. Pressione F5 para andar um passo, entrando nos métodos. Ou F6 para andar um passo sem entrar nos métodos.

Observar o programa passo a passo permite que você veja exatamente qual linha não está se comportando como o esperado. Permite que você teste exatamente os valores das variáveis, e confira se elas estão de acordo com o que você imaginava.
É um requisito básico de qualquer programador, inclusive os iniciantes, saber usar o depurador.

E é bem fácil de usa-lo.

guj1

Aprendi a depurar! =)

É e repondendo sua pergunta, o dado está armazenando sim o cpf.
Só que na hora que vai para o sysout(aluno) na view cariables fica assim: coluna name: this, coluna Value: AlunoAcademia(id=21), no outline não aparece nada, e no PrintStream.println(object) line: not avaliable.

Eu acho que ele quer dizer que eu não posso imprimir um objeto por meio do println.

ViniGodoy

Para imprimir um objeto usando print você deve implementar o método toString na classe desse objeto. Por exemplo:

public class Aluno {
    //Resto da classe aqui

    @Override
    public String toString() {
        return String.format("Matrícula: %d   Nome: %s", matricula, nome);
    }
}
Criado 17 de novembro de 2012
Ultima resposta 2 de dez. de 2012
Respostas 12
Participantes 4