Seu código está totalmente errado.
Primeiramente, você não pode mexer na lista enquanto itera sobre ela, a menos que esteja usando um iterator. Depois, você não pode simplesmente achar que um produto não foi encontrado, só porque o if falhou na primeira vez. Seria necessário testar se o código entrou naquele if alguma vez.
Finalmente, o código está tem algumas redundâncias. Por exemplo, você já testa se o nome.equals(""), portanto, não precisa testar novamente a condição inversa no else.
O correto seria algo assim:
public Produto apagarProduto(String nome) {
//Deixe a interface gráfica capturar a exceção e exibir a mensagem
if(nome == null || nome.isEmpty())
throw new IllegalArgumentException("Por favor, digite o nome do producto no campo nome!");
Iterator<Produto> it = produto.iterator();
while (it.hasNext()) {
Produto p = it.next();
if (nome.equals(p.nome)) {
it.remove(); //Maneira certa de remover enquanto percorre
return p; //Retorna o produto removido
}
}
return null; //Produto não removido
}
Note que esse método retorna o produto removido, ou nulo, caso nenhum produto tenha sido removido. Portanto, fica a cargo da sua interface gráfica adicionar o resultado ao JTextArea, ou dar uma mensagem de que nenhum produto foi removido.
Para que seu código não fique confuso é importante não misturar código de interface gráfica com código da lógica do seu sistema. Além disso, procure usar corretamente o JOptionPane. O primeiro parâmetro dele exige a janela que está abrindo o JOptionPane e não null, como vc está passando.