我正在尝试从GAMUT java库生成Polymatrix游戏。
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();
}
我收到以下错误:
致命错误:无法生成polymatrix游戏(子游戏鸡)
显示java.lang.NullPointerException
我一直在挖掘源代码,但我找不到错误的来源。错误消息本身也不是很有用。
最终,我正在尝试使用给定数量的玩家生成随机Polymatrix游戏并为每个玩家提供一系列操作。
答案 0 :(得分:0)
经过一些挖掘源代码和调试之后,
我发现导致NullPointerException
。
GAMUT假设您要求使用命令行生成游戏。它将命令的参数存储在String
类中名为gArgs
的{{1}}数组变量中。
Global
当生成 // -- Original command line
public static String[] gArgs;
游戏时,会调用PolyMatrix
类中的方法,将GameOutput
gArgs
数组更改为正常String
然后将其存储在相关的String
对象中。上面提到的方法如下。
PolyMatrix
在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();
}
类中调用如下。 Game
如果GameOutput.arrayToString(Global.gArgs, " ")
为Global.gArgs
,则出于明显原因会抛出null
。这正是原始帖子中代码示例中发生的情况,因为NullPointerException
从未设置过。
快速解决方案:将Global.args
设置为无意义的内容,例如Global.gArgs
最佳解决方案:实际上将Global.gArgs = new String[]{""};
设置为Global.gArgs
的数组,其中包含您从命令行生成游戏时所提供的参数。
像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", "[]"}
的实际值略有不同。
然而,奇怪的是,像PrisonersDilemma和Chicken这样的简单游戏不需要设置Global.gArgs
变量。