StringTemplate映射操作中的奇怪NullPointerException

时间:2017-01-27 15:25:02

标签: java stringtemplate stringtemplate-4

这是我用于生成import语句的StringTemplate模板,该模板对{i | import <i>;<\n>}中的每个值执行匿名模板imports的映射操作。

importdecl(imports) ::= "<if(imports)> <imports: {i | import <i>;<\n>}> <endif>"

这会引发java.lang.NullPointerException at org.stringtemplate.v4.misc.ErrorManager.runTimeError(ErrorManager.java:133)

奇怪的是,当我将i更改为其他内容时,这非常有效,我确信在这两种情况下输入都没有区别。像这样不会抛出错误,

importdecl(imports) ::= "<if(imports)> <imports: {r | import <r>;<\n>}> <endif>"

i是保留还是StringTemplate中的东西还是我遗漏了什么?

2 个答案:

答案 0 :(得分:2)

<i>用于访问数组中基于1的索引。

例如,

ST st = stGroup.getInstanceOf("importdecl");
int[] data = {4, 5};
st.add("imports", data);
System.out.println(st.render());

使用模板

importdecl(imports) ::= <<
  <if(imports)><imports: {k | import <i><k>;<\n>}><endif>
>>

打印:

import 14;
import 25;

我建议使用不同的变量名称:)

More info herehere

答案 1 :(得分:2)

是的,我已保留。保留关键字列表:

i,i0

在应用于一个或多个属性的模板中进行引用时,分别从1和0索引的迭代次数。

  • 默认
  • 第一
  • 如果
  • 实现
  • 界面
  • 最后
  • 长度
  • 可选
  • 休息
  • 条带
  • 超级
  • trunc
  • 其他
  • endif
  • elseif