【问题标题】:Weird NullPointerException in StringTemplate map operationStringTemplate 映射操作中的奇怪 NullPointerException
【发布时间】:2023-03-07 11:27:01
【问题描述】:

这是我用于生成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 中的某些东西,还是我遗漏了什么?

【问题讨论】:

    标签: java stringtemplate stringtemplate-4


    【解决方案1】:

    <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

    【讨论】:

    • 是的,我完全忽略了它,认为这是理所当然的!
    【解决方案2】:

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

    i,i0

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

    • 默认
    • 首先
    • 如果
    • 实现
    • 界面
    • 最后
    • 长度
    • 可选
    • 休息
    • 剥离
    • 超级
    • 截断
    • 其他
    • 结束
    • 否则

    【讨论】:

    猜你喜欢
    • 2014-04-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-01-11
    • 2013-11-25
    • 2017-02-18
    • 1970-01-01
    相关资源
    最近更新 更多