BeanShell:检查变量是否为null的正确方式

编程入门 行业动态 更新时间:2024-10-26 03:25:36

BeanShell:检查<a href=https://www.elefans.com/category/jswz/34/1771380.html style=变量是否为null的正确方式"/>

BeanShell:检查变量是否为null的正确方式

BeanShell是一个小型、免费、可嵌入的 Java 源代码 具有对象脚本语言功能的解释器,用 Java 编写。 BeanShell动态执行标准Java语法,并使用通用语法对其进行扩展 脚本编写便利性,适用于 Java 的轻量级脚本。
在Java中判断一个变量是否为null很简单的事儿 null == v1,
BeanShell是一个支持Java语法的的脚本解释器,按道理null == v1也是支持的,我一直是这么理解的, 大量测试也没问题。
但是今天在写单元测试时,因为手误,在解释器执行脚本时没有为变量v1定义值。
按我的理解,解释器对没有定义的变量应该会报错,但是没有,解释器正常执行了,对于null==v1返回了false
你可以在BeanShell命令行解释器中执行 print(null ==v1);验证此现象结果就是输出false

这就颠覆我对BeanShell的理解了,于是赶紧去BeanShell的官方网站翻资料,
大概理解了原因:

BeanShell 虽然支持标准的Java语法,但与Java强类型语言特性不同,BeanShell是个弱类型的脚本语言,弱类型的语言的一个特点就是变量可以不需要预声明,这也是 BeanShell的语言特性—就是支持松散类型的 Java 语法,也就是说,你可以引用变量,而不需要先声明它们,也不指定任何类型。

因为BeanShell这个未声明即可引用的特性,所以对于没有声明的变量在执行与null==比较时恒为false,也就是说未声明的变量恒不为空,且不会报错。

所以如果在BeanShell中简单使用null != v1null == v1对变量判null或非null时,如果变量v1没有被定义得到的结果是不正确的。

解决方案一

根据BeanShell官方文档《Undefined Variables》说明,可以通过如下判断变量是否等于内置变量void在判断变量是否被定义了。

if ( foobar == void ){// 为true时变量未定义
}

所以我们要判断一个变量是否为null的时候,应该先判断它是否有被定义这样才能得到正确的结果
如下:

if (void != v1 && null == v1){// 为true时v1有定义且为null
}

单元测试示例:

public BshTest{@Testpublic void test13UndefinedVariable() {try {Interpreter interpreter = new Interpreter();  // Construct an interpreterinterpreter.eval("b1=(null == v1);print(b1);"+ "b2=(void == v1);print(b2);");assertTrue(Boolean.FALSE.equals( interpreter.get("b1")));assertTrue(Boolean.TRUE.equals( interpreter.get("b2")));} catch (EvalError e) {e.printStackTrace();assertFalse(true);}}
}

解决方案二

上一个解决方案确实解决了当变量未定义时判null或非null表达式可以得到正确结果,但是,在实际开发中我们往往要求所有的变量都预定义的,不允许未定义的变量情况存在,那么这时方案一就会隐藏变量未定义的错误,因为它不会报错抛出异常。在我的项目中就是这样的需求:变量未定义的情况是一种设计中的缺陷必须报错。
所以要求在判断变量是否为null的时候,如果变量未定义直接抛出异常。
怎么解决呢?其实在BeanShell脚本执行时真正引用到未定义的变量的值的时候,解释器就会抛出异常,所以我们可以把判null和非null封装成一个方法,将变量做为参数传递给方法,这样未定义的符号就会导致解释器在调用方法时抛出异常,如下为单元测试示例:

public BshTest{@Testpublic void test14BuiltinIsNull() {try {Interpreter interpreter = new Interpreter();  // Construct an interpreter// 将当前对象添加到namespace,这样脚本中才可以访问对象中的方法,isNull,isNonullinterpreter.getNameSpace().importObject(this);interpreter.eval("print(isNull(v1));");fail();} catch (EvalError e) {// v1没有定义肯定会执行到这里抛出异常System.out.println(e.getMessage());assertFalse(false);}}/** 内置判断null方法 */public boolean isNull(Object value) {return null == value;}/** 内置判断非null方法 */public boolean isNonull(Object value) {return null != value;}
}

参考资料

《Undefined Variables》

更多推荐

BeanShell:检查变量是否为null的正确方式

本文发布于:2024-03-23 23:18:17,感谢您对本站的认可!
本文链接:https://www.elefans.com/category/jswz/34/1744022.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
本文标签:变量   正确   方式   BeanShell   null

发布评论

评论列表 (有 0 条评论)
草根站长

>www.elefans.com

编程频道|电子爱好者 - 技术资讯及电子产品介绍!