Método retornando nulo

Bom dia a todos.

Eu tenho um map que uso como “database” para armazenar algumas coisas. Imagine um sistema de matrículas.

Pois bem. Esse método aqui percorre procurando um curso cadastrado, e eu sei que esse curso existe, mas ainda assim ele só cai no null. Não tô entendendo o pq…

public CursoEntity findByName(String name){
List<CursoEntity> cursoList = new ArrayList<>(getDatabase().values());
for (CursoEntity cursoEntity : cursoList) {
boolean isName = cursoEntity.getNome().equals(name);
if (isName) {
return cursoEntity;
}
}
return null;
}

(imagens do meu debugger)

Mas a lista não está vazia e ele está pulando o For-Each aí no debug?

Então, não está vazia. Na verdade, quando eu chamo o método que procura um curso pelo nome (que usa esse método), ele me retorna tranquilo. Mas quando chamo o método para procurar o curso e fazer a matrícula, ele não acha.

Tava vendo aqui e não entendi uma coisa: O meu database, nesse método, retorna size=0, mas quando chamo ele normalmente apenas procurando ele retorna o size certo. Véi, isso tá me deixando doido, hue.

Bom dia!

Se você já tem um map com as informações, pq você não busca as informações nele, ao invés de converte-lo para uma lista e então iterar, tendo a possibilidade do curso que você quer estar na última posição? Não é viável utilizar a chave do map como sendo uma String (o próprio nome)? Ou até um Set?

Como o @Daniel95 disse, se a lista esta vazia, vai retornar null mesmo.

Talvez seja necessário postar mais códigos.

Estou usando um map para simular um banco de dados.

Quando eu cadastro um curso nesse map e quero listar ele, consigo tranquilamente. Mas quando quero criar uma matricula, o getDatabase().values retorna o tamanho de lista 0, e então ele não cai no meu foreach.

Cadastro do curso:

void cadastrarCurso() {
    String nome = JOptionPane.showInputDialog("Digite o nome do curso");
    int numeroAulas = Integer.parseInt(JOptionPane.showInputDialog("Digite o número de aulas"));
    entity = this.curso.save(new CursoEntity(nome, numeroAulas));
    JOptionPane.showMessageDialog(null, "Curso cadastrado!\nTítulo: "+entity.getNome()+"\nNúmero de Aulas: "+entity.getNumeroAulas()+"\nID: "+entity.getId());
}

@Override
public CursoEntity save(CursoEntity cursoEntity) {
    cursoEntity.setId(getNextId());
    getDatabase().put(cursoEntity.getId(), cursoEntity);
    return cursoEntity;
}

Visualizar Curso

CursoEntity procurarPorNome(String nome) {
    entity = curso.findByName(nome);
    JOptionPane.showMessageDialog(null, "ID: " + entity.getId() + "\nCurso cadastrado: " + entity.getNome() + "\nNúmero de Aulas: " + entity.getNumeroAulas());
    return entity;
}

public CursoEntity findByName(String name){
    List<CursoEntity> cursoList = new ArrayList<>(getDatabase().values());
    for (CursoEntity cursoEntity : cursoList) {
        boolean isName = cursoEntity.getNome().equals(name);
        if (isName) {
            return cursoEntity;
        }
    }
    return null;
}

Fazer matrícula:

void fazerMatricula() {
    userEntity = userController.encontrarPorNome(JOptionPane.showInputDialog("Digite o nome do aluno a ser cadastrado"));
    cursoEntity = cursoController.procurarPorNome(JOptionPane.showInputDialog("Digite o nome do curso"));
    matriculaRepo.save(new MatriculaEntity(selecionarUsuário(userEntity), cursoEntity));
}
}

Acho que basicamente é isso.

  • O que é getDatabase() e o seu método values()?
  • Que tipo de retorno é values()?

Porque eu estou perguntando isso, parece que o seu código é repetição

  • Não existe uma forma de fazer um filtro em vez de um for?

São perguntas porque acho o seu código pode ser melhor!

Oi, Dragoon. Obrigado pelas sugestões.

O getDatabase() é o get do meu map. O values é metodo do Map, mesmo. Acredito que o tipo de retorno de values é um int.

1 curtida

De um exemplo de values? criando um variavel do tipo e a preenchendo para que eu possa entender! @FearX

O values não retorna a Collection dos Values do Map que são as instâncias de Curso cadastradas?
Os valores do Map são sempre armazenados e recuperados em memória? É um atributo de que classe e como é manipulado? O que pode estar acontecendo é de ter mais de uma instância deste Map rolando por aí, e quando você busca e faz matricula, retorne ou consulte instâncias diferentes. No caso desta controller utilizar outro recurso:
cursoEntity = cursoController.procurarPorNome(JOptionPane.showInputDialog(“Digite o nome do curso”));

Provavelmente, em algum momento, seu database está sendo recriado. Você precisar controlar bem o estado dele para não ter risco de perder a instância. Como vc está criando seu database? Existe uma classe responsável por cuidar dele (do map)?

A instância que cadastra é a mesma que consulta?

Você pode tentar aplicar um Singleton ou definir o map como static

1 curtida