[RESOLVIDO] Programa - cadastro de alunos, disciplinas e boletins - AJUDA

Olá, sou nova por aqui, então por favor, me perdoem qualquer erro.
Estou aprendendo programação em java na faculdade, e me foi proposto o seguinte exercício:

**Criar um projeto em Java, de acordo com os requisitos abaixo e as explicações do professor no laboratório:

  • Um aluno (matricula e nome) pode ter várias disciplinas (codigo e nome).
  • Cada disciplina pode ter vários alunos.
  • Boletim se refere a um aluno em uma disciplina. Portanto, deverá ter um atributo Aluno e um atributo Disciplina. Ele deverá conter nota1, nota2, mediaFinal, frequencia, aprovado (boolean).
  • Criar as três classes e relacionamentos, bem como gets, sets e os outros serviços.
  • Boletim deverá ter um serviço ToString, que deverá imprimir o nome do aluno, da disciplina, as notas, a frequencia e se foi ou não aprovado;
  • As outras classes devem possuir serviço ToString;
  • Boletim deverá ter um serviço chamado avaliarAluno(), que deverá registrar se o aluno foi aprovado na disciplina do boletim, desde que a média final seja maior ou igual a 6, e a frequencia maior que 75.
  • Criar e testar os serviços de conexão (Factory) e acesso a dados (DAO), que deverá incluir, alterar, excluir, obter uma lista e obter um único objeto para todas as classes do modelo. Atente para o Boletim, que depende de outros objetos como atributo.
  • Realizar Testes em uma classe Executável no pacote “visao”.**

Já consegui fazer boa parte do programa.Ele já adiciona Alunos disciplinas e boletins no banco de dados(Estou usando o postgresql), porém não estou conseguindo fazer a parte da consulta do boletim no BD . Consigo consultar e e retornar para o programa as informações de alunos e disciplinas, mas não estou conseguindo fazer o mesmo com o boletim.

Seguem do meu código, as classes boletim e Cadastro_AlunosDao:

`package model;

public class Boletim {

private int id;
private int idA;
private int idD;
private Aluno aluno;
private Disciplina disciplina;
private double nota1;
private double nota2;
private double mediaFinal;
private double frequencia;
private boolean aprovado;

public Boletim() {
	
}

public Boletim(Aluno aluno, Disciplina disciplina) {
	this.aluno = aluno;
	this.disciplina = disciplina;
}

public void setId(int id) {
	this.id = id;
}

public void setIdAluno(int idA) {
	this.idA = idA;
}


public void setIdDisciplina(int idD) {
	this.idD = idD;
}

public void setAluno(Aluno aluno) {
	this.aluno = aluno;
}

public void setDisciplina(Disciplina disciplina) {
	this.disciplina = disciplina;
}

public void setNota1(double nota1) {
	this.nota1 = nota1;
}

public void setNota2(double nota2) {
	this.nota2 = nota2;
}

public void setMediaFinal(double mediaFinal) {
	this.mediaFinal = mediaFinal;
}

public void setFrequencia(double frequencia) {
	this.frequencia = frequencia;
}

public void setAprovado(boolean aprovado) {
	this.aprovado = aprovado;
}

public int getId() {
	return id;
}

public int getIdA() {
	return idA;
}

public int getIdD() {
	return idD;
}

public Aluno getAluno() {
	return aluno;
}

public Disciplina getDisciplina() {
	return disciplina;
}

public double getNota1() {
	return nota1;
}

public double getNota2() {
	return nota2;
}

public double getMediaFinal() {
	return mediaFinal;
}

public double getFrequencia() {
	return frequencia;
}

public boolean isAprovado() {
	return aprovado;
}

public void calcularMediaFinal() {
	mediaFinal = (nota1 + nota2)/2;
	
}

public void avaliarAluno() {
	if(mediaFinal >= 6.0 && frequencia > 75.0) {
		aprovado = true;
	}else {
		aprovado = false;
	}
}

@Override
public String toString(){
	String str = "";
	str += this.aluno.toString();
	str += this.disciplina.toString();
	str += "\nId do aluno: " + this.idA;
	str += "\nId da Disciplina: " + this.idD;
	str += "\nNota 1: " + this.nota1;
	str += "\nNota 2: " + this.nota2;
	str += "\nFrequência: " + this.frequencia;
	str += "\nMédia final: " + this.mediaFinal;
	str += "\nAprovado? " + this.aprovado;
	return str;
}

}

`

`package dao;

import java.sql.*;
import java.util.ArrayList;
import java.util.List;

import model.Aluno;
import model.Boletim;
import model.Disciplina;

public class Cadastro_AlunosDao {

private Connection conexao;

public Cadastro_AlunosDao() {
	
	this.conexao = new ConnectionFactory().getConnection();
}




public void add_Aluno(Aluno aluno) {
	
	String sql = "";
	sql += "INSERT INTO ALUNOS(AL_NOME , AL_MATRICULA)";
	sql += "VALUES (? , ?)";
	
	try {
		PreparedStatement stm = this.conexao.prepareStatement(sql, Statement.RETURN_GENERATED_KEYS);
		stm.setString(1, aluno.getNome());
		stm.setInt(2, aluno.getMatricula());
		int quantidade = stm.executeUpdate();
        ResultSet generatedKeys = stm.getGeneratedKeys();
        if(generatedKeys.next()) {
        	int id = 0;
        	id = generatedKeys.getInt("al_id");
        	aluno.setId(id);
        }
       

		System.out.println("Atualizados " + quantidade + " registros na tabela Alunos.\n");
		
	}catch(Exception e){
		
		e.printStackTrace();
	}
	

}



public void add_Disciplina(Disciplina disciplina) {
	
	String sql = "";
	sql += "INSERT INTO DISCIPLINAS(DIS_CODIGO , DIS_NOME)";
	sql += "VALUES (? , ?)";
	
	try {
		PreparedStatement stm = this.conexao.prepareStatement(sql, Statement.RETURN_GENERATED_KEYS);
		stm.setInt(1, disciplina.getCodigo());
		stm.setString(2, disciplina.getNome());
		int quantidade = stm.executeUpdate();
        ResultSet generatedKeys = stm.getGeneratedKeys();
        if(generatedKeys.next()) {
        	int id = 0;
        	id = generatedKeys.getInt("dis_id");
        	disciplina.setId(id);
        }
		System.out.println("Atualizados " + quantidade + " registros na tabela Disciplinas.\n");	
		
	}catch(Exception e){
		
		e.printStackTrace();
	}

}
			

public void add_Boletim(Boletim boletim) {
	
	String sql = "";
	sql += "INSERT INTO BOLETINS(AL_ID, DIS_ID, BOL_NOTA1, BOL_NOTA2, BOL_MEDIAFINAL, BOL_FREQUENCIA, BOL_APROVADO)";
	sql += "VALUES (?, ?, ?, ?, ?, ?, ?)";
	
	try {
		
		PreparedStatement stm = this.conexao.prepareStatement(sql);
		stm.setInt(1, boletim.getAluno().getId());
		stm.setInt(2, boletim.getDisciplina().getId());
		stm.setDouble(3, boletim.getNota1());
		stm.setDouble(4,boletim.getNota2());
		stm.setDouble(5, boletim.getMediaFinal());
		stm.setDouble(6, boletim.getFrequencia());
		stm.setBoolean(7, boletim.isAprovado());
		int quantidade = stm.executeUpdate();
		System.out.println("Atualizados" + quantidade + " registros na tabela Boletins. \n");	
		
	}catch(Exception e) {
		
		e.printStackTrace();
	}
}


public void excluir_Aluno(Aluno aluno) {
	String sql = "";
	sql += "DELETE FROM ALUNOS WHERE AL_ID = ?";
	
	try {
		
		PreparedStatement Stm = this.conexao.prepareStatement(sql);
		
		Stm.setInt(1, aluno.getId());
		
		Stm.executeUpdate();

	} catch (Exception e) {
		e.printStackTrace();
	}
}


public void excluir_Disciplina(Disciplina disciplina) {
	String sql = "";
	sql += "DELETE FROM DISCIPLINAS WHERE DIS_ID = ?";
		
	try {
			
		PreparedStatement Stm = this.conexao.prepareStatement(sql);
			
		Stm.setInt(1, disciplina.getId());
			
		Stm.executeUpdate();

	} catch (Exception e) {
			e.printStackTrace();
	}
		
}
	
	public void excluir_Boletim(Boletim boletim) {
		String sql = "";
		sql += "DELETE FROM BOLETINS WHERE BOL_ID = ?";
		
		try {
			
			PreparedStatement Stm = this.conexao.prepareStatement(sql);
			
			Stm.setInt(1, boletim.getId());
			Stm.executeUpdate();

		} catch (Exception e) {
			e.printStackTrace();
		}
		
	}
	
	
	public Aluno getAlInstance(int chave) {
		String sql = "";
		sql += "SELECT ALUNOS.* FROM ALUNOS WHERE ALUNOS.AL_ID = ?";
		Aluno alunoPraRetornar = new Aluno();
		
		try {
			
			PreparedStatement stm = this.conexao.prepareStatement(sql);
			stm.setInt(1, chave);
			ResultSet rs = stm.executeQuery();
			
			while (rs.next()) {
				alunoPraRetornar.setId(rs.getInt("AL_ID"));
				alunoPraRetornar.setMatricula(rs.getInt("AL_MATRICULA"));
				alunoPraRetornar.setNome(rs.getString("AL_NOME"));

			}
			
			
		} catch (Exception e){
			e.printStackTrace();
		}
		
		return alunoPraRetornar;
	}
	
	public Disciplina getDisInstance(int chave) {
		String sql = "";
		sql += "SELECT DISCIPLINAS.* FROM DISCIPLINAS WHERE DISCIPLINAS.DIS_ID = ?";
		Disciplina disciplinaPraRetornar = new Disciplina();
		
		try {
			
			PreparedStatement stm = this.conexao.prepareStatement(sql);
			stm.setInt(1, chave);
			ResultSet rs = stm.executeQuery();
			
			while (rs.next()) {
				disciplinaPraRetornar.setId(rs.getInt("DIS_ID"));
				disciplinaPraRetornar.setCodigo(rs.getInt("DIS_CODIGO"));
				disciplinaPraRetornar.setNome(rs.getString("DIS_NOME"));

			}
			
			
		} catch (Exception e){
			e.printStackTrace();
		}
		
		return disciplinaPraRetornar;
	}
	
	public Boletim getBolAlInstance(int chave) {
		String sql = "";
		sql += "SELECT BOLETINS.al_id, BOLETINS.dis_id, bol_nota1, bol_nota2, bol_mediafinal, bol_frequencia, bol_aprovado, bol_id,AL_NOME, AL_MATRICULA, DIS_NOME, DIS_CODIGO FROM public.boletins INNER JOIN ALUNOS ON(BOLETINS.AL_ID = ALUNOS.AL_ID) INNER JOIN DISCIPLINAS ON (BOLETINS.DIS_ID = DISCIPLINAS.DIS_ID) WHERE BOLETINS.AL_ID = ?";
		Boletim boletimPraRetornar = new Boletim();
		
		try {
			
			PreparedStatement stm = this.conexao.prepareStatement(sql);
			stm.setInt(1, chave);
			ResultSet rs = stm.executeQuery();
			
			while (rs.next()) {
				boletimPraRetornar.setId(rs.getInt("BOL_ID"));
				boletimPraRetornar.setIdAluno(rs.getInt("AL_ID"));
				boletimPraRetornar.getAluno().setNome(rs.getString("AL_NOME"));
				boletimPraRetornar.getAluno().setMatricula(rs.getInt("AL_MATRICULA"));
				boletimPraRetornar.setIdDisciplina(rs.getInt("DIS_ID"));
				boletimPraRetornar.getDisciplina().setNome(rs.getString("DIS_NOME"));
				boletimPraRetornar.getDisciplina().setCodigo(rs.getInt("DIS_CODIGO"));
				boletimPraRetornar.setNota1(rs.getDouble("BOL_NOTA1"));
				boletimPraRetornar.setNota2(rs.getDouble("BOL_NOTA2"));
				boletimPraRetornar.setMediaFinal(rs.getDouble("BOL_MEDIAFINAL"));
				boletimPraRetornar.setFrequencia(rs.getDouble("BOL_FREQUENCIA"));
				boletimPraRetornar.setAprovado(rs.getBoolean("BOL_APROVADO"));
				
			}
			
			
		} catch (Exception e){
			e.printStackTrace();
		}
		
		return boletimPraRetornar;
	}

}`

Quando executo o programa, chamando o método getBolAlInstance() ocorre o seguinte erro:

java.lang.NullPointerException
at dao.Cadastro_AlunosDao.getBolAlInstance(Cadastro_AlunosDao.java:228)
at view.Teste.main(Teste.java:51)
Exception in thread “main” java.lang.NullPointerException
at model.Boletim.toString(Boletim.java:122)
at view.Teste.main(Teste.java:52)

Vc n pode pegar um objeto d um método e sair usando sem antes ter setado um valor a ele(Aluno) ou certificar-se que n esteja nulo.

Antes de chamar o método get BolAlInstance(); eu chamo o método getAlInstance, que trás do banco de dados as informações do aluno. Mas mesmo assim ainda recebo esse erro, acusando que o objeto aluno está nulo…

NÃO. Vc cria um objeto novo o qual n inicializa o atributo aluno.

A questão é que vc está fazendo este getAluno (pegando o valor), mas onde vc fez o setAluno pra atribuir um valor a ele? Precisa ter um valor se quiser usar.

O código abaixo já é um exemplo de uso do objeto Aluno. E se não foi feito boletimPraRetornar.setAluno() vc terá o erro q está dando: NullPointerException.

Terá o mesmo problema linhas abaixo com a Disciplina.

Fiz da seguinte forma e funcionou.

`public Boletim getBolAlInstance(Boletim boletimPraRetornar, Aluno aluno, Disciplina disciplina) {
		
		boletimPraRetornar.setAluno(aluno);
		boletimPraRetornar.setDisciplina(disciplina);
		
		String sql = "";
		sql += "SELECT bol_nota1, bol_nota2, bol_mediafinal, bol_frequencia, bol_aprovado,bol_id FROM public.boletins INNER JOIN ALUNOS ON(BOLETINS.AL_ID = ALUNOS.AL_ID) INNER JOIN DISCIPLINAS ON (BOLETINS.DIS_ID = DISCIPLINAS.DIS_ID) WHERE BOLETINS.AL_ID = ?";
		
		
		
		try {
			
			PreparedStatement stm = this.conexao.prepareStatement(sql);
			stm.setInt(1, aluno.getId());
			ResultSet rs = stm.executeQuery();
			
			while (rs.next()) {
				boletimPraRetornar.setNota1(rs.getDouble("BOL_NOTA1"));
				boletimPraRetornar.setNota2(rs.getDouble("BOL_NOTA2"));
				boletimPraRetornar.setMediaFinal(rs.getDouble("BOL_MEDIAFINAL"));
				boletimPraRetornar.setFrequencia(rs.getDouble("BOL_FREQUENCIA"));
				boletimPraRetornar.setAprovado(rs.getBoolean("BOL_APROVADO"));
				boletimPraRetornar.setId(rs.getInt("BOL_ID"));
				
			}
			
			
		} catch (Exception e){
			e.printStackTrace();
		}
		
		return boletimPraRetornar;
	}`

MUITO OBRIGADA!!!