StringTemplate 映射操作中的奇怪 NullPointerException

Weird NullPointerException in StringTemplate map operation

这是我用于生成 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 中的某些内容,或者我是否遗漏了什么?

<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 here and here

是的,我是 reserved.List 个保留关键字:

i, i0

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

  • 默认
  • 第一
  • 如果
  • 实施
  • 界面
  • 最后
  • 长度
  • 可选
  • 休息
  • 剥离
  • 超级
  • 截断
  • 其他
  • 结束
  • 其他