2017-01-27 3 views
1

Это мой шаблон StringTemplate для генерации операторов import, который выполняет операцию отображения на анонимном шаблоне {i | import <i>;<\n>} для каждого значения в imports.Weird NullPointerException в операции с строкой Template

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 или я что-то отсутствует?

ответ

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

+0

Да, я полностью забыл, приняв это как должное! – scarecrow