Adicionar itens ao Array

Boa tarde, estou me batendo faz um tempo pra pegar os dados de uma tabela, jogar em um array, e exibir o array dentro dessa outra tabela, meu problema é no método adicionarCarrinho(), toda vez que execute o código ele me volta um Null Pointer Exception, alguém pode me ajudar com lógica disso ?

Classes modelo:

    public class ItemDoPedido{

        private int id;
        private int quantidade;
        private Produto produto;
    /* getters and setters*/

    public class Produto{

        public int id;
        public String descricao;
    /*getters and setters*/



Meu managed Bean

@ManagedBean(name="CarrinhoMB")
    @SessionScoped
    public class carrinhoMB {

        private ItemDoPedido item;

        private List<ItemDoPedido> carrinho;
        private ItemdoPedidoDAO iDAO = new ItemdoPedidoDAO();

        private Produto produto;
        private List<Produto> produtos;
        private ProdutoDAO pDAO = new ProdutoDAO();

/*getters and setters*/

        public carrinhoMB() {
            produto = new Produto();
            produtos = pDAO.MostrarProdutos();
        }
MINHA DÚVIDA É NO MÉTODO ABAIXO

 public void adicionarCarrinho(Produto produto) {
            this.produto = produto;
            item.setProduto(produto);
            item.setQuantidade(1);
            carrinho.add(item);
        }

Minha tela:

<h:form> 
                    <p:panel header="Produtos">
                        <p:dataTable var="produto" value="#{produtoMB.produtos}"  scrollable="true" scrollWidth="1200px" scrollHeight="200">
                            <p:column  headerText="Id">
                                <h:outputText value="#{produto.id}" />
                            </p:column>

                            <p:column  headerText="Descrição">
                                <h:outputText value="#{produto.descricao}" />
                            </p:column>

                            <p:column headerText="Adicionar">
                                <p:commandButton value="Adicionar" id="carrinho" action="#{CarrinhoMB.adicionarCarrinho(produto)}" styleClass="ui-priority-primary" ajax="false"/>
                            </p:column>
                        </p:dataTable>
                    </p:panel>
                </h:form>

                <h:form> 
                    <p:panel header="Carrinho">
                        <p:dataTable var="carrinho" value="#{CarrinhoMB.carrinho}">
                            <p:column  headerText="Produto">
                                <h:outputText value="#{carrinho.p.descricao}" />
                            </p:column>

                            <p:column  headerText="Quantidade">
                                <h:outputText value="#{carrinho.quantidade}" />
                            </p:column>

                            <p:column headerText="Aumentar">
                                <p:commandButton value="Aumentar" id="aumentar" action="#{produtoMB.excluirProduto(produto)}" styleClass="ui-priority-primary" ajax="false"/>
                            </p:column>

                            <p:column headerText="Diminuir">
                                <p:commandButton value="Diminuir" id="diminuir" action="#{produtoMB.excluirProduto(produto)}" styleClass="ui-priority-primary" ajax="false"/>
                            </p:column>
                        </p:dataTable>
                    </p:panel>
                </h:form>

Onde você instancia esse objeto? Tenho certeza que o erro estoura nessa linha

Eu achei que fazendo ItemDoPedido item já servia pra acessar os atribuitos.

Eu fiz assim agora e o Null Pointer estorou na hora de adicionar ao carrinho

public void adicionarCarrinho(Produto produto) {
ItemDoPedido item2 = new ItemDoPedido();
this.produto = produto;
item2.setP(produto);
item2.setQuantidade(1);
carrinho.add(item2); //Estorou aqui
}

Mesma coisa.

Entenda que o JSF é extremamente burro. Vocẽ é quem deve dizer tudo o que ele deve fazer, principalmente quando você tem objetos envolvidos.
Ou você instancia esses objetos ou usa CDI para controlar o seu ciclo de vida (ou algum outro meio de inversão de controle).

Entendi,ótima explicação sua, muito obrigado.
E o código deu certo

Viu, não querendo me aproveitar, se puder me tirar mais uma dúvida

Eu criei o método excluir:

public void removerCarrinho(){
carrinho.remove(item);
}

E instanciei a classe fora dos métodos

ItemDoPedido item = new ItemDoPedido()

Se eu usar SessionScoped, ele insere o item + o anterior e não funciona o método excluir, se usar RequestScoped ele funciona o excluir, mas só insere um item no array, eu vi as diferenças entre os dois e vou usar o Session, você pode me dar um norte no que estou errando ?