NullPointerException ao adicionar um objeto na lista

14 respostas
java
Kaique_Heinen

Fala pessoal, beleza?

Estou tentando construir uma lista de Work Records. Mas ao adicionar o workrecord em uma lista ela me da um erro de NullPointerException.
Ao meu ver, todos os campos que eu desejo estão preenchidos.

Estou aprendendo Java ainda, bem básico.

Segue meu codigo:

public List<WorkRecordVo> findWorkRecord(String id) {
	Task task =  new Task();
	task.setId(new ObjectId(id));
	
	List<WorkRecordVo> listworkrecordsVo =  new ArrayList<WorkRecordVo>();
	List<ALMWorkRecord> listworkRecords = almWorkRecordDAO.findWorkRecordByTask(task);
	
	for (ALMWorkRecord workRecord : listworkRecords) {
		WorkRecordVo workrecord = new WorkRecordVo();
		SimpleDateFormat formateDate = new SimpleDateFormat("dd/MM/yyyy HH:mm:ss");
		workrecord.setDataSync(formateDate.format(workRecord.getDataSync()));
		workrecord.setTimeSpentReal(workRecord.getTimeSpentReal());
		workrecord.setIdContributor(workRecord.getIdContributor());
		workrecord.setComment(workRecord.getComment());
		workrecord.setAvatar("https://miro.medium.com/fit/c/336/336/0*xFDeApkUaLTOeSDb.jpg");
		
		Contributor contributor = contributorDAO.findByIdContributor(workRecord.getIdContributor());
		workrecord.setContributorName(contributor.getName());
		
		listworkrecordsVo.add(workrecord);
	}
	
	return listworkrecordsVo;
}

14 Respostas

Lucas_Camara

Qual a linha que ocorreu o NPE?

I

Arrume o título do post…

Kaique_Heinen

listworkrecordsVo.add(workrecord); Ocorre nessa parte, Lucas.

I

A lista

não deveria receber dados do tipo WorkRecordVo? No entanto, tu está passando dados do tipo ALMWorkRecord:

É uma coisa a verificar, embora isso, aparentemente não pareça gerar um NPE, mas sim uma exceção de tipo. Além disso, o retorno do seu método deveria ser List<E> e não apenas List. Logo:

public List<WorkRecordVo> findWorkRecord(String id){

}

ou

public List<ALMWorkRecord> findWorkRecord(String id){

}
Kaique_Heinen

A ideia era transformar a lista de ALMWorkRecord para uma lista de WorkRecordVo.
Pq eu estou fazendo isso?
Pq quero apenas alguns atributos da ALMWorkRecord, então criei a classe WorkRecordVo.

Não entendi a parte que o retorno deveria ser List e não List.
Se puder me explicar melhor.

I

Uma lista precisa saber de que ela é lista. Então: List<Tipo>:

public List<WorkRecordVo> findWorkRecord(String id) ou
public List<ALMWorkRecord> findWorkRecord(String id), dependendo do retorno que tu quer, da mesma forma que tu fez nas declarações de criação das listas.

Kaique_Heinen

Ah, entendi.

Ja esta assim List findWorkRecord(String id){}

E meu retorno pra ela e do tipo WorkRecordVo tambem.

listworkrecordsVo é do tipo WorkRecordVo. E é onde eu tenho adicionar o workrecord nela que também é do tipo WorkRecordVo.

Pq não ta adicionando, não sei, ainda não to conseguindo identificar o erro.

I

Isso:

é igual a isso public List<WorkRecordVo> findWorkRecord(String id)?

Kaique_Heinen

Sim. É igual. public List<WorkRecordVo> findWorkRecord(String id){...}

Kaique_Heinen

Como não sei muito bem usar essa plataforma, a primeira parte não foi reconhecida como um codigo

I

Então, no seu código não está igual:

public List findWorkRecord(String id){

	Task task =  new Task();
	task.setId(new ObjectId(id));
	
	List<WorkRecordVo> listworkrecordsVo =  new ArrayList<WorkRecordVo>();
	List<ALMWorkRecord> listworkRecords = almWorkRecordDAO.findWorkRecordByTask(task);
	
	
	for (ALMWorkRecord workRecord : listworkRecords) {
		
		WorkRecordVo workrecord = new WorkRecordVo();
		SimpleDateFormat formateDate = new SimpleDateFormat("dd/MM/yyyy HH:mm:ss");
		workrecord.setDataSync(formateDate.format(workRecord.getDataSync()));
		workrecord.setTimeSpentReal(workRecord.getTimeSpentReal());
		workrecord.setIdContributor(workRecord.getIdContributor());
		workrecord.setComment(workRecord.getComment());
		workrecord.setAvatar("https://miro.medium.com/fit/c/336/336/0*xFDeApkUaLTOeSDb.jpg");
		
		Contributor contributor = contributorDAO.findByIdContributor(workRecord.getIdContributor());
		workrecord.setContributorName(contributor.getName());
		
		
		listworkrecordsVo.add(workrecord);
	}
}

E eu disse que era para ser algo como:

public List<WorkRecordVo> findWorkRecord(String id){

	Task task =  new Task();
	task.setId(new ObjectId(id));
	
	List<WorkRecordVo> listworkrecordsVo =  new ArrayList<WorkRecordVo>();
	List<ALMWorkRecord> listworkRecords = almWorkRecordDAO.findWorkRecordByTask(task);
	
	
	for (ALMWorkRecord workRecord : listworkRecords) {
		
		WorkRecordVo workrecord = new WorkRecordVo();
		SimpleDateFormat formateDate = new SimpleDateFormat("dd/MM/yyyy HH:mm:ss");
		workrecord.setDataSync(formateDate.format(workRecord.getDataSync()));
		workrecord.setTimeSpentReal(workRecord.getTimeSpentReal());
		workrecord.setIdContributor(workRecord.getIdContributor());
		workrecord.setComment(workRecord.getComment());
		workrecord.setAvatar("https://miro.medium.com/fit/c/336/336/0*xFDeApkUaLTOeSDb.jpg");
		
		Contributor contributor = contributorDAO.findByIdContributor(workRecord.getIdContributor());
		workrecord.setContributorName(contributor.getName());
		
		
		listworkrecordsVo.add(workrecord);
	}
}
I

Você testou se o método findWorkRecordByTask(task) está retornando valores válidos e não null?

Kaique_Heinen

Verdade. Mas foi falha mesmo na hora de digitação aqui.

Kaique_Heinen

Encontrei o erro.
Meu banco me retornava dois registros.
Um possuia a data, o outro não. Consequentemente ele retornava Null

Criado 1 de junho de 2020
Ultima resposta 1 de jun. de 2020
Respostas 14
Participantes 3