Olá, estudante, como vai?
O comportamento que você descreveu ocorre porque na função capturaComando a chamada recursiva não retorna o valor para a execução original da função. Isso faz com que, mesmo depois de inserir um valor válido, o programa finalize ao voltar ao menu.
Para resolver, basta retornar o resultado da nova chamada. Por exemplo, em capturaComando, use return capturaComando(); dentro do if, assim o valor correto é devolvido à função principal.
if (entrada == null || !comandos.contains(entrada)) {
print("Comando inválido. Tente novamente.");
return capturaComando();
}
Com essa alteração, o programa continuará funcionando normalmente e retornará ao menu quando o usuário inserir um valor inválido.
Espero ter ajudado.
Siga firme nos seus estudos e conte com o fórum sempre que precisar.
Abraços :)
Caso este post tenha lhe ajudado, por favor, marcar como solucionado