Seguindo o código apresentado na aula, este capítulo, acabo tomando um NullPointerException sempre que tento inserir um Produto dentro de uma categoria. O engraçado é que, debugando, o objeto para inserção vem populado e o erro ocorre no meu método de inserção, dentro da classe Categoria. Classe Categoria
public class Categoria {
    private final Integer id;
    private final String nome;
    private List<Produto> produtos;
    public Categoria(Integer id, String nome) {
        this.id = id;
        this.nome = nome;
    }
    public void adicionaProduto(Produto produto){
        produtos.add(produto);
    }
    @Override
    public String toString() {
        return "[" + id + " - " + nome +"]";
    }
    public Integer getId() {
        return id;
    }
    public String getNome() {
        return nome;
    }
    public List<Produto> getProdutos() {
        return produtos;
    }
}
Método de listagem de categoria e seus produtos, dentro da Classe CategoriaDAO
public List<Categoria> listaComPordutos() throws SQLException {
        List<Categoria> categoriaComProdutos = new ArrayList<Categoria>();
        Categoria categoriaAtual = null;
        String sql = "select c.id as c_id, c.nome as c_nome, p.id as p_id, p.nome as p_nome, p.descricao as p_descricao from Categoria as c join Produto as p on p.categoria_id = c.id";
        try(PreparedStatement ps = con.prepareStatement(sql)){
            ps.execute();
            try(ResultSet rs = ps.getResultSet()){
                while(rs.next()){
                    int catId = rs.getInt(1);
                    String catNome = rs.getString(2);
                    if(categoriaAtual == null || !categoriaAtual.getNome().equals(catNome)){
                        Categoria categoria = new Categoria(catId, catNome);
                        categoriaComProdutos.add(categoria);
                        categoriaAtual = categoria;
                    }
                     int prodId = rs.getInt(3);
                     String prodNome = rs.getString(4);
                     String prodDescricao = rs.getString(5);
                     Produto p = new Produto(prodNome, prodDescricao);
                     p.setId(prodId);
                     categoriaAtual.adicionaProduto(p);
                }
            }
        }
        return categoriaComProdutos;
    }
Método na classe de Testes
public class TestaCategorias {
    public static void main(String[] args) throws SQLException {
        try(Connection con = new ConnectionPool().getConnection()){
            CategoriaDAO dao = new CategoriaDAO(con);
            List<Categoria> categoriasComProduto = dao.listaComPordutos();
            for (Categoria categoria : categoriasComProduto) {
                System.out.println(categoria);
                for (Produto produto : categoria.getProdutos()) {
                    System.out.println(produto.getNome());
                }
            }
        }
    }
}
Alguém sabe me dizer, onde exatamente estou errando?