精华帖 (0) :: 良好帖 (3) :: 新手帖 (4) :: 隐藏帖 (0)
|
|
---|---|
作者 | 正文 |
发表时间:2009-11-23
曾经给你提过添加compile的建议,在2.1.2版本中也确实出现了compile方法
但在应用中,实际上还是有问题。 如果不给变量赋值的话,编译是会报错的 比如这样的代码。 String expression ="(0<得分 && 得分<=20)?10:10.2"; ExpressionEvaluator.compile(expression); 会抛出异常错误。 而在实际使用过程中,往往会是用户录入了一个表达式,这时他并不知道“得分”这个变量的具体值,但想知道自己录入的公式是否合法,而用compile方法没有办法实现这一点。 不知道是我程序写的不对还是什么其他原因。 |
|
返回顶楼 | |
发表时间:2009-11-23
kilo8850 写道 曾经给你提过添加compile的建议,在2.1.2版本中也确实出现了compile方法
但在应用中,实际上还是有问题。 如果不给变量赋值的话,编译是会报错的 比如这样的代码。 String expression ="(0<得分 && 得分<=20)?10:10.2"; ExpressionEvaluator.compile(expression); 会抛出异常错误。 而在实际使用过程中,往往会是用户录入了一个表达式,这时他并不知道“得分”这个变量的具体值,但想知道自己录入的公式是否合法,而用compile方法没有办法实现这一点。 不知道是我程序写的不对还是什么其他原因。 是这样的,变量可以不用赋值,但必须在上下文中预先声明,可以给null值,没有声明的变量是会出错的,就是java语言一样,必须先定义不是?! |
|
返回顶楼 | |
发表时间:2009-11-23
linliangyi2007 写道 kilo8850 写道 曾经给你提过添加compile的建议,在2.1.2版本中也确实出现了compile方法 但在应用中,实际上还是有问题。 如果不给变量赋值的话,编译是会报错的 比如这样的代码。 String expression ="(0<得分 && 得分<=20)?10:10.2"; ExpressionEvaluator.compile(expression); 会抛出异常错误。 而在实际使用过程中,往往会是用户录入了一个表达式,这时他并不知道“得分”这个变量的具体值,但想知道自己录入的公式是否合法,而用compile方法没有办法实现这一点。 不知道是我程序写的不对还是什么其他原因。 是这样的,变量可以不用赋值,但必须在上下文中预先声明,可以给null值,没有声明的变量是会出错的,就是java语言一样,必须先定义不是?! 嗯,刚才测试了一下,如果是基本的语法,比如 0<得分,编译就会报错 如果我自定义了一个函数,比如: <bean class="test.CustomFunctions"> <function name="between" method="between1"> <parameter-type>double</parameter-type> <parameter-type>double</parameter-type> <parameter-type>double</parameter-type> </function> </bean> 那么expression ="$between(得分,0,20)"; 编译的时候就不会报错,这时就没检查得分这个变量是否声明了 |
|
返回顶楼 | |
发表时间:2009-11-23
kilo8850 写道 linliangyi2007 写道 kilo8850 写道 曾经给你提过添加compile的建议,在2.1.2版本中也确实出现了compile方法
但在应用中,实际上还是有问题。 如果不给变量赋值的话,编译是会报错的 比如这样的代码。 String expression ="(0<得分 && 得分<=20)?10:10.2"; ExpressionEvaluator.compile(expression); 会抛出异常错误。 而在实际使用过程中,往往会是用户录入了一个表达式,这时他并不知道“得分”这个变量的具体值,但想知道自己录入的公式是否合法,而用compile方法没有办法实现这一点。 不知道是我程序写的不对还是什么其他原因。 是这样的,变量可以不用赋值,但必须在上下文中预先声明,可以给null值,没有声明的变量是会出错的,就是java语言一样,必须先定义不是?! 嗯,刚才测试了一下,如果是基本的语法,比如 0<得分,编译就会报错 如果我自定义了一个函数,比如: <bean class="test.CustomFunctions"> <function name="between" method="between1"> <parameter-type>double</parameter-type> <parameter-type>double</parameter-type> <parameter-type>double</parameter-type> </function> </bean> 那么expression ="$between(得分,0,20)"; 编译的时候就不会报错,这时就没检查得分这个变量是否声明了 请看主贴: 1.根据网友提出的要求,修订了对未声明变量的处理,早期版本不允许变量未申明,将抛出异常。新版本将未申明变量视为 null,这样解决了上下文中对不存在的变量的判断问题,如 “variable == null”将返回 true。 不报错的原因是把“得分”这个变量当成null对待了。这个估计和你的逻辑不符的。 表达式之所以报错,是因为<=操作不支持null型 |
|
返回顶楼 | |
发表时间:2009-11-24
linliangyi2007 写道 请看主贴: 1.根据网友提出的要求,修订了对未声明变量的处理,早期版本不允许变量未申明,将抛出异常。新版本将未申明变量视为 null,这样解决了上下文中对不存在的变量的判断问题,如 “variable == null”将返回 true。 不报错的原因是把“得分”这个变量当成null对待了。这个估计和你的逻辑不符的。 表达式之所以报错,是因为<=操作不支持null型 我就是看了主贴,所以以为这个版本里面的变量没有声明的话,是不会报错的,所以才有前面的理解。可能理解有误吧 但我又发现了一个问题: 0<=得分 这个表达式编译会报错 但0==得分 就不会报错 |
|
返回顶楼 | |
发表时间:2009-11-24
kilo8850 写道 我就是看了主贴,所以以为这个版本里面的变量没有声明的话,是不会报错的,所以才有前面的理解。可能理解有误吧 但我又发现了一个问题: 0<=得分 这个表达式编译会报错 但0==得分 就不会报错 是的, 因为 == 号支持对 null型的比较啊。如果你把未声明的变量当成null,一切逻辑就都通顺了。 |
|
返回顶楼 | |
发表时间:2009-11-24
楼主,有个疑问,我自己定义了一个包:
package org.wltea.expression.test.funadd; public class newMethod { public String sayHello(String value) { return value; } } 然后在配置文件中配置: <bean class="org.wltea.expression.test.funadd.newMethod"> <function name="SAYHELLO" method="sayHello"> <parameter-type>java.lang.String</parameter-type> </function> </bean> 然后引用SAYHELLO: public static void main(String[] args) { String expression = "$SAYHELLO(\"A\")"; Object result=ExpressionEvaluator.evaluate(expression, null); System.out.println("Result=" + result); } 出现错误: 函数"SAYHELLO"不存在或参数类型不匹配 处理对象:SAYHELLO 请问是我哪里弄错了吗? |
|
返回顶楼 | |
发表时间:2009-11-24
Xiehgjava 写道 楼主,有个疑问,我自己定义了一个包:
package org.wltea.expression.test.funadd; public class newMethod { public String sayHello(String value) { return value; } } 然后在配置文件中配置: <bean class="org.wltea.expression.test.funadd.newMethod"> <function name="SAYHELLO" method="sayHello"> <parameter-type>java.lang.String</parameter-type> </function> </bean> 然后引用SAYHELLO: public static void main(String[] args) { String expression = "$SAYHELLO(\"A\")"; Object result=ExpressionEvaluator.evaluate(expression, null); System.out.println("Result=" + result); } 出现错误: 函数"SAYHELLO"不存在或参数类型不匹配 处理对象:SAYHELLO 请问是我哪里弄错了吗? 看不出有问题啊,感觉你的配置文件没有被正确读取,检查一下运行路径吧。 |
|
返回顶楼 | |
发表时间:2009-11-25
linliangyi2007 写道 Xiehgjava 写道 楼主,有个疑问,我自己定义了一个包:
package org.wltea.expression.test.funadd; public class newMethod { public String sayHello(String value) { return value; } } 然后在配置文件中配置: <bean class="org.wltea.expression.test.funadd.newMethod"> <function name="SAYHELLO" method="sayHello"> <parameter-type>java.lang.String</parameter-type> </function> </bean> 然后引用SAYHELLO: public static void main(String[] args) { String expression = "$SAYHELLO(\"A\")"; Object result=ExpressionEvaluator.evaluate(expression, null); System.out.println("Result=" + result); } 出现错误: 函数"SAYHELLO"不存在或参数类型不匹配 处理对象:SAYHELLO 请问是我哪里弄错了吗? 看不出有问题啊,感觉你的配置文件没有被正确读取,检查一下运行路径吧。 配置文件是放在java工程的根目录下吧?还是放在src目录下? |
|
返回顶楼 | |
发表时间:2009-11-25
Xiehgjava 写道 linliangyi2007 写道 Xiehgjava 写道 楼主,有个疑问,我自己定义了一个包:
package org.wltea.expression.test.funadd; public class newMethod { public String sayHello(String value) { return value; } } 然后在配置文件中配置: <bean class="org.wltea.expression.test.funadd.newMethod"> <function name="SAYHELLO" method="sayHello"> <parameter-type>java.lang.String</parameter-type> </function> </bean> 然后引用SAYHELLO: public static void main(String[] args) { String expression = "$SAYHELLO(\"A\")"; Object result=ExpressionEvaluator.evaluate(expression, null); System.out.println("Result=" + result); } 出现错误: 函数"SAYHELLO"不存在或参数类型不匹配 处理对象:SAYHELLO 请问是我哪里弄错了吗? 看不出有问题啊,感觉你的配置文件没有被正确读取,检查一下运行路径吧。 配置文件是放在java工程的根目录下吧?还是放在src目录下? src是根下面,类的根路径 |
|
返回顶楼 | |