Exception in thread "main" java.lang.NullPointerException ao executar classe de teste

5 respostas
programaçãojavamysql
C
Olá gente, estou criando uma classe de teste que busca uma lista do banco de dados. Para isso criei um uma classe Exame e uma classe ExameDAO e estou usando o DataSource para criar a conexão com o Banco de Dados MySQL. Porém ao executar a classe de teste aparece a seguinte mensagem no console: "Exception in thread “main” java.lang.NullPointerException

at br.unama.dao.ExameDAO.consultaExame(ExameDAO.java:35)

at br.unama.testes.TestaLista.main(TestaLista.java:15)"

Ficarei grato, caso alguém ajude. Segue abaixo as classes.

identar texto pre-formatado em 4 espaços

package br.unama.modelo;

import java.util.Calendar;
import java.util.Date;

public class Exame {

//Define o tipo do exame, se é um ecocardiograma, eletrocardiograma ou mapa on houter

private  int idExame;
private String tipoExame;
private Calendar dataExame;
//Define qual o diagnóstico do médico
private String hipotseDiagnostico;
private String cid;
private String status;


public Exame() {
	
}

public Exame(int idExame2, String tipoExame2, String dataExame2, String hipotseDiagnostico2, String cid2, String status2) {
	super();		
	this.idExame = idExame;
	this.tipoExame = tipoExame;
	this.dataExame = dataExame;
	this.hipotseDiagnostico = hipotseDiagnostico;
	this.cid = cid;
	this.status = status;
}

public String getTipoExame() {
	return tipoExame;
}
public void setTipoExame(String tipoExame) {
	this.tipoExame = tipoExame;
}
public int getIdExame() {
	return idExame;
}
public void setIdExame(int idExame) {
	this.idExame = idExame;
}
public Calendar getDataExame() {
	return dataExame;
}
public void setDataExame(Calendar dataExame) {
	this.dataExame = dataExame;
}
public String getHipotseDiagnostico() {
	return hipotseDiagnostico;
}
public void setHipotseDiagnostico(String hipotseDiagnostico) {
	this.hipotseDiagnostico = hipotseDiagnostico;
}
public String getCid() {
	return cid;
}
public void setCid(String cid) {
	this.cid = cid;
}

public String getStatus() {
	return status;
}
public void setStatus(String status) {
	this.status = status;
}

}
identar texto pre-formatado em 4 espaços

identar texto pre-formatado em 4 espaços

package br.unama.dao;

import java.sql.Connection;

import java.sql.ResultSet;

import java.sql.SQLException;

import java.sql.Statement;

import java.util.ArrayList;

import java.util.Calendar;

import java.util.List;

import javax.sql.DataSource;

import br.unama.modelo.Exame;

public class ExameDAO {

private DataSource datasource;

private List<Exame> listExame;

public ExameDAO(DataSource ds){
	this.datasource = ds;
	
}

public List<Exame> consultaExame(){
	
	listExame = new ArrayList<Exame>();
	Connection con = null;
	Statement st = null;
	ResultSet result = null;
	
	//obter conexão com o banco de dados
	try {			
		con = datasource.getConnection();
		//Criar o SQL
		st = con.createStatement();		
		String sql = "Select * from exame";
		//executa o sql
		
		result = st.executeQuery(sql);
		
		//processar os dados retornados
		
		while(result.next()) {
			
			Exame exames = new Exame();
			
			exames.setTipoExame(result.getString("tipoExame"));
			exames.setIdExame(result.getInt("idexame"));
			Calendar data = Calendar.getInstance();
			data.setTime(result.getDate("data-exam"));
			exames.setDataExame(data);
			exames.setHipotseDiagnostico(result.getString("hipo_diag"));
			exames.setCid(result.getString("cid"));
			exames.setStatus(result.getString("status"));
			/*
			String tipoExame = result.getString("tipoExame");
			int idExame = result.getInt("idexame");
			String dataExame = result.getString("data-exam");
			String hipotseDiagnostico = result.getString("hipo_diag");
			String cid = result.getString("cid");
			String status = result.getString("status");
			*/
			//Exame exame = new Exame(idExame, tipoExame, dataExame, hipotseDiagnostico, cid, status);
			listExame.add(exames);	
			
			con.close();
			st.close();
			
		}
	} catch (SQLException e) {
		
		e.printStackTrace();
	}

	return listExame;
	
	
}

}
identar texto pre-formatado em 4 espaços

identar texto pre-formatado em 4 espaços

package br.unama.testes;

import java.util.Calendar;
import java.util.List;

import br.unama.dao.ExameDAO;
import br.unama.modelo.Exame;

public class TestaLista {

public static void main(String[] args) {
	
	ExameDAO dao = new ExameDAO(null);
	
	List<Exame> exames = dao.consultaExame(); 
	
	for(Exame exame: exames) {
		
		System.out.println("Tipo Exame: " + exame.getTipoExame());
		System.out.println("ID Exame: " + exame.getIdExame() );
		System.out.println("Data Exame: "+ exame.getDataExame().getTime()+"\n");
		System.out.println("Hipotese Diagnostico" + exame.getHipotseDiagnostico());
		System.out.println("CID: " + exame.getCid());
		System.out.println("Statuso: " + exame.getStatus());
	
		
	}

}

}
identar texto pre-formatado em 4 espaços

5 Respostas

T

Se a linha 35 da mensagem de erro for esta:

Pode ser que tenha algum erro na sua classe ou método de conexão com o BD.

C

Pois é, não vejo o problema.
Deveria ser nessa classe. A linha 35 é onde está o con = datasource.getConnection(); Ou seja, de alguma forma ele não está buscando a conexão. É isso?

Blockquotepackage br.unama.dao;

import java.sql.Connection;

import java.sql.ResultSet;

import java.sql.SQLException;

import java.sql.Statement;

import java.util.ArrayList;

import java.util.Calendar;

import java.util.List;

import javax.sql.DataSource;

import br.unama.modelo.Exame;

public class ExameDAO {

private DataSource datasource;

private List<Exame> listExame;

public ExameDAO(DataSource ds){
	this.datasource = ds;
	
}

public List<Exame> consultaExame(){
	
	listExame = new ArrayList<Exame>();
	Connection con = null;
	Statement st = null;
	ResultSet result = null;
	
	//obter conexão com o banco de dados
	try {			
		con = datasource.getConnection();
		//Criar o SQL
		st = con.createStatement();		
		String sql = "Select * from exame";
		//executa o sql
		
		result = st.executeQuery(sql);
		
		//processar os dados retornados
		
		while(result.next()) {
			
			Exame exames = new Exame();
			
			exames.setTipoExame(result.getString("tipoExame"));
			exames.setIdExame(result.getInt("idexame"));
			Calendar data = Calendar.getInstance();
			data.setTime(result.getDate("data-exam"));
			exames.setDataExame(data);
			exames.setHipotseDiagnostico(result.getString("hipo_diag"));
			exames.setCid(result.getString("cid"));
			exames.setStatus(result.getString("status"));
			/*
			String tipoExame = result.getString("tipoExame");
			int idExame = result.getInt("idexame");
			String dataExame = result.getString("data-exam");
			String hipotseDiagnostico = result.getString("hipo_diag");
			String cid = result.getString("cid");
			String status = result.getString("status");
			*/
			//Exame exame = new Exame(idExame, tipoExame, dataExame, hipotseDiagnostico, cid, status);
			listExame.add(exames);	
			
			con.close();
			st.close();
			
		}
	} catch (SQLException e) {
		
		e.printStackTrace();
	}

	return listExame;
	
	
}

}

S

Este é o construtor da classe ExameDAO:

public ExameDAO(DataSource ds){
    this.datasource = ds;
}

Assim é como você está invocando ele no meu método main:

ExameDAO dao = new ExameDAO(null);

Ou seja, está inicializando o atributo datasource com null.

C

Olá staroski, obrigado pela resposta. O que eu deveria “passar” na inicialização do construtor nesse caso? Pois quando eu instanciei, por padrão ele já veio com null.

S

Como você instanciou “por padrão” se sua classe não possui um construtor padrão?

Você só possui um construtor parametrizado, que espera receber um objeto do tipo DataSource, que você está passando como null.

Uma instância de um DataSource, procure a documentação do seu driver para ver qual é a classe que implementa java.sql.DataSource.

Criado 18 de novembro de 2018
Ultima resposta 20 de nov. de 2018
Respostas 5
Participantes 3