0

我正在尝试从GAMUT java 库生成 Polymatrix Games。

    try {
        PolymatrixGame polyGame = new PolymatrixGame();
        
        polyGame.setParameter("players", nbOfPlayers); //nbOfPlayers = 3L;
        polyGame.setParameter("actions", nbOfActions); //nbOfActions is a Vector<String> with three entries: each equal "2".
        polyGame.setParameter("graph", "RandomGraph");
        
        polyGame.setParameter("graph_params", new ParamParser(new String[] {"-nodes", "" + nbOfPlayers, "-edges", "" + 3, "-sym_edges", "1", "-reflex_ok", "0"}));
        polyGame.setParameter("subgame", "Chicken");
        polyGame.setParameter("subgame_params", new ParamParser());
        
        polyGame.initialize();

        polyGame.doGenerate();
        
    } catch (Exception e) {
        e.printStackTrace();
    }

我收到以下错误:

致命错误:无法生成多矩阵游戏(子游戏鸡)

java.lang.NullPointerException

我一直在挖掘源代码,但找不到错误的根源。错误消息本身也不是很有用。

最终,我试图生成一个随机的 Polymatrix 游戏,其中包含给定数量的玩家和给定数量的每个玩家的动作。

4

1 回答 1

0

在深入挖掘源代码和调试之后,我发现是什么导致了NullPointerException.

GAMUT 假设您要求使用命令行生成游戏。它将命令的参数存储在类中String命名的数组变量中。gArgsGlobal

  // -- Original command line
  public static String[] gArgs;

生成游戏时,会调用该类中PolyMatrix的一个方法,将s 的数组更改为法线,然后将其存储在相关对象中。下面给出所提到的方法。GameOutputgArgsStringStringPolyMatrix

public static String arrayToString(String[] args, String sep)
{
StringBuffer buff=new StringBuffer();
for(int i=0; i<args.length; i++) {
    buff.append(args[i]);
    if (i!=args.length-1)
    buff.append(sep);
}

return buff.toString();
}

它在类中调用如下GameGameOutput.arrayToString(Global.gArgs, " ")

如果Global.gArgsnull,那么 aNullPointerException将被抛出,原因很明显。这正是原始帖子中的代码示例中发生的情况,因为Global.args从未设置过。

快速解决方案:设置Global.gArgs为无意义的东西Global.gArgs = new String[]{""};

最佳解决方案:如果要从命令行生成游戏,实际设置Global.gArgs为包含参数的 s 数组。String就像是Global.gArgs = new String[]{"-players", "3", "-actions", "2", "-graph", "RandomGraph", "-graph_params", "[-nodes 3 - edges 3 - sym_edges 1 -reflex_ok 0]", "-subgame", "Chicken", "-subgame_params", "[]"}

Global.gArgs(如果游戏是从命令行实际生成的,给出的“最佳”解决方案的示例可能会或可能不会与实际值略有不同)。

然而奇怪的是,像 PrisonersDilemma 和 Chicken 这样的简单游戏不需要设置gArgs变量。

于 2016-01-27T00:46:36.117 回答