Exercicio de Orientaçao a Objeto 2

Ola estou fazendo um exercicio de orientaçao a objeto e gostaria de saber porque esta dando este erro e porque esta passando objeto nulo pois nao consegui enxergar alguem me ajuda?

classe matricula

package br.com.fabricadeprogramador.exerc1;

import java.util.Date;

public class Matricula {

private Integer codigo;
private Date data;
private Curso curso;
private Aluno aluno;


public Integer getCodigo() {
	return codigo;
}
public void setCodigo(Integer codigo) {
	this.codigo = codigo;
}
public Date getData() {
	return data;
}
public void setData(Date data) {
	this.data = data;
}
public Curso getCurso() {
	return curso;
}
public void setCurso(Curso curso) {
	this.curso = curso;
}
public Aluno getAluno() {
	return aluno;
}
public void setAluno(Aluno aluno) {
	this.aluno = aluno;
}

}

Classe Aluno

package br.com.fabricadeprogramador.exerc1;

public class Aluno extends Matricula{

private String nome;
private String cpf;
public String getNome() {
	return nome;
}
public void setNome(String nome) {
	this.nome = nome;
}
public String getCpf() {
	return cpf;
}
public void setCpf(String cpf) {
	this.cpf = cpf;
}

}

Classe Curso

package br.com.fabricadeprogramador.exerc1;

public class Curso extends Matricula {

private String nome;
private Integer cargahoraria;
public String getNome() {
	return nome;
}
public void setNome(String nome) {
	this.nome = nome;
}
public Integer getCargahoraria() {
	return cargahoraria;
}
public void setCargahoraria(Integer cargahoraria) {
	this.cargahoraria = cargahoraria;
}

}

Classe que uso para fazer o metodo imprimir e cadastrar

package br.com.fabricadeprogramador.exerc1;

public class GerenciadorMatricula {

Matricula pessoas[] = new Matricula[3];
int numEntradas = 0;

public void cadastrar(Matricula nova) {
	if (numEntradas < pessoas.length) {
		pessoas[numEntradas] = nova;
		numEntradas++;
	}
}

public void imprimir() {
	for (int i = 0; i < pessoas.length; i++) {
		System.out.println("Código: " + pessoas[i].getCodigo() + ", Data: " + pessoas[i].getData() + ", Curso: " + pessoas[i].getCurso() + ", Aluno: " + pessoas[i].getAluno());
		if(pessoas[i] instanceof Aluno){
			System.out.println("Nome: " + ((Aluno)pessoas[i]).getNome()+"Cpf:" + ((Aluno)pessoas[i]).getCpf());
		}else if(pessoas[i] instanceof Curso){
			System.out.println("Nome do Curso: " + ((Curso)pessoas[i]).getNome()+"Carga Horária:" + ((Curso)pessoas[i]).getCargahoraria());
		}
	}
}

}

Classe principal

package br.com.fabricadeprogramador.exerc1;

import java.util.Scanner;

public class ProgramaPrincipalMatricula {

public static void main(String[] args) {
	
	GerenciadorMatricula gerenciador = new GerenciadorMatricula();
	Scanner scan = new Scanner(System.in);
	Aluno a = new Aluno();
	
	System.out.println("Digite o nome do aluno");
	a.setNome(scan.nextLine());
	System.out.println("Digite o cpf do aluno");
	a.setCpf(scan.nextLine());
	
	Curso c = new Curso();
	System.out.println("Digite o nome do curso");
	c.setNome(scan.nextLine());
	System.out.println("Digite a carga horária");
    c.setCargahoraria(scan.nextInt());
	

	
	gerenciador.cadastrar(a);
	gerenciador.cadastrar(c);
	
	gerenciador.imprimir();
}

}

alguem me ajuda?

erro:

Digite o nome do aluno
carlos
Digite o cpf do aluno
837894
Digite o nome do curso
historia
Digite a carga horária
7
Exception in thread “main” java.lang.NullPointerException
at br.com.fabricadeprogramador.exerc1.GerenciadorMatricula.imprimir(GerenciadorMatricula.java:18)
at br.com.fabricadeprogramador.exerc1.ProgramaPrincipalMatricula.main(ProgramaPrincipalMatricula.java:29)
Código: null, Data: null, Curso: null, Aluno: null
Nome: carlosCpf:837894
Código: null, Data: null, Curso: null, Aluno: null
Nome do Curso: historiaCarga Horária:7