论坛首页 Java企业应用论坛

发布IK Expression开源表达式解析器 V2.1.2

浏览 15413 次
精华帖 (0) :: 良好帖 (3) :: 新手帖 (4) :: 隐藏帖 (0)
作者 正文
   发表时间:2009-11-23  
曾经给你提过添加compile的建议,在2.1.2版本中也确实出现了compile方法
但在应用中,实际上还是有问题。
如果不给变量赋值的话,编译是会报错的
比如这样的代码。

String expression ="(0<得分 && 得分<=20)?10:10.2";
ExpressionEvaluator.compile(expression);
会抛出异常错误。
而在实际使用过程中,往往会是用户录入了一个表达式,这时他并不知道“得分”这个变量的具体值,但想知道自己录入的公式是否合法,而用compile方法没有办法实现这一点。
不知道是我程序写的不对还是什么其他原因。
0 请登录后投票
   发表时间:2009-11-23  
kilo8850 写道
曾经给你提过添加compile的建议,在2.1.2版本中也确实出现了compile方法
但在应用中,实际上还是有问题。
如果不给变量赋值的话,编译是会报错的
比如这样的代码。

String expression ="(0<得分 && 得分<=20)?10:10.2";
ExpressionEvaluator.compile(expression);
会抛出异常错误。
而在实际使用过程中,往往会是用户录入了一个表达式,这时他并不知道“得分”这个变量的具体值,但想知道自己录入的公式是否合法,而用compile方法没有办法实现这一点。
不知道是我程序写的不对还是什么其他原因。


是这样的,变量可以不用赋值,但必须在上下文中预先声明,可以给null值,没有声明的变量是会出错的,就是java语言一样,必须先定义不是?!
0 请登录后投票
   发表时间: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)";
编译的时候就不会报错,这时就没检查得分这个变量是否声明了
0 请登录后投票
   发表时间: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型
0 请登录后投票
   发表时间:2009-11-24  
linliangyi2007 写道


请看主贴:
1.根据网友提出的要求,修订了对未声明变量的处理,早期版本不允许变量未申明,将抛出异常。新版本将未申明变量视为 null,这样解决了上下文中对不存在的变量的判断问题,如 “variable == null”将返回 true。

不报错的原因是把“得分”这个变量当成null对待了。这个估计和你的逻辑不符的。

表达式之所以报错,是因为<=操作不支持null型


我就是看了主贴,所以以为这个版本里面的变量没有声明的话,是不会报错的,所以才有前面的理解。可能理解有误吧
但我又发现了一个问题:
0<=得分
这个表达式编译会报错
但0==得分
就不会报错
0 请登录后投票
   发表时间:2009-11-24  
kilo8850 写道

我就是看了主贴,所以以为这个版本里面的变量没有声明的话,是不会报错的,所以才有前面的理解。可能理解有误吧
但我又发现了一个问题:
0<=得分
这个表达式编译会报错
但0==得分
就不会报错

是的, 因为 == 号支持对 null型的比较啊。如果你把未声明的变量当成null,一切逻辑就都通顺了。
0 请登录后投票
   发表时间: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
请问是我哪里弄错了吗?

0 请登录后投票
   发表时间: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
请问是我哪里弄错了吗?




看不出有问题啊,感觉你的配置文件没有被正确读取,检查一下运行路径吧。
0 请登录后投票
   发表时间: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目录下?
0 请登录后投票
   发表时间: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是根下面,类的根路径
0 请登录后投票
论坛首页 Java企业应用版

跳转论坛:
Global site tag (gtag.js) - Google Analytics