最近,我在Jep上做了一些测试,下面有一些片段,
Jep jep = new Jep();
jep.parse("x*2");
for (int i = 1; i <= 5; i++) {
if (i <= 2) {
jep.addVariable("x", i);
}
try {
System.out.println(jep.evaluate());
} catch (Exception ex) {
System.out.println("N/A");
}
}我期望的是,
2.0 4.0 N/A N/A N/A但真正的结果是,
2.0 4.0 4.0 4.0 4.0然后我意识到jep保留了上次使用的变量值,所以我更新代码以调用jep.getVariableTable().clearValues(),
Jep jep = new Jep();
jep.parse("x*2");
for (int i = 1; i <= 5; i++) {
jep.getVariableTable().clearValues();
if (i <= 2) {
jep.addVariable("x", i);
}
try {
System.out.println(jep.evaluate());
} catch (Exception ex) {
System.out.println("N/A");
}
}我可以看到,当variableTable中的变量值为null时,但是输出仍然是,
2.0 4.0 4.0 4.0 4.0我可能对Jep或variableTable有一个很大的误解,有人能帮我解释一下吗?谢谢。
发布于 2016-09-28 20:22:34
是的,这看起来像是Jep系统中的一个bug。clearValues()方法在变量中设置一个validValue标志。实际上,在返回值之前,评估程序应该测试此标志。(见可变API
一种解决办法是使用
for(Variable var:jep.getVariableTable().getVariables()) {
var.setValue(null);
}更好的解决方案是重写FastEvaluator
static class MyEvaluator extends FastEvaluator {
private static final long serialVersionUID = 1L;
@Override
public Object visit(ASTVarNode node, Object data) throws EvaluationException {
Variable var = node.getVar();
if(!var.hasValidValue())
throw new EvaluationException("Value not set");
return super.visit(node, data);
}
},然后可以在Jep构造函数中使用
Jep jep = new Jep(new MyEvaluator());我将在下一个版本中修复评估器。
https://stackoverflow.com/questions/36928755
复制相似问题