新闻资讯

    这是Jerry 2020年的第53篇文章,也是汪子熙公众号总共第236篇原创文章。

    ABAP里的IS BOUND, IS NOT 和IS 这组关键字,如果平时不留心,很容易理解地似是而非。今天我们就来说一说它们的区别。

    先把SAP帮助文档抄过来:

    IS BOUND

    It a a valid . A data that a stack , on the other hand, can even if the data is from the stack.

    IS

    the is . The is true, if the its type- value.

    IS

    a area is to a field . The is true if the field to a area.

    简单翻译成中文:

    IS BOUND:用于检查一个引用变量是否指向了一个有效的引用。帮助文档特意提到,如果一个引用指向的是一个栈上申请的变量定义静态成员关键字,那么这个变量会随栈的销毁而被销毁,因此指向其的引用不再有效。

    IS : 用于检查一个变量的值是否为其数据类型对应的初始值。

    比如我定义一个引用变量但不对其赋值,则IS 判断一定为.

    IS : 对于检测的field ,该关键字判断该field 是否分配有内存区域。

    这三个关键字交织在一起,就形成了一些有趣的排列组合。

    比如,是否存在NOT , 但同时也NOT BOUND的变量?是否存在同时满足IS , NOT BOUND和IS 的field ? 下面我们用一个简单的ABAP报表来研究这些排列组合。

    完整的测试代码:

    同时满足NOT 和NOT BOUND的引用变量

    下图main方法里,第15行在栈上定义了一个整型变量,将其引用赋给类的成员变量dref. 待main方法执行之后,所生存的栈帧被销毁,因此dref指向的引用不再有效,调试器里显示为:FREED STACK.

    现在dref并不是未指向任何引用,而是指向一个无效的引用,因此dref同时满足IS NOT 和IS NOT BOUND.

    IS

    一个field 定义之后,如果不为其分配内存区域,则IS 返回.

    下面的代码,如果注释掉第27行的IF条件:

    运行时会抛出错误:Field has not yet been .

    也就是说,无论是读取field 具体的内容,还是检测其内容是否为初始值,为了避免错误,我们必须在IS 判断之前,使用IS 判断field 是否被分配了内存区域。

    是否存在一个NOT BOUND, IS 但是却IS 的field ?

    答案是肯定的。

    上面代码第37行定义的名为的field ,在第45行的CLEAR操作完成之后定义静态成员关键字,就同时满足这三个条件。这个field 被分配的内存区域,内容并不是整型数本身,而是一个指向整型变量的引用。

    该报表打印输出如下:

    第40行代码通过分配给的内存区域并未通过释放,因此 IS 始终返回. 另一方面,这块内存区域虽然还未释放,但里面存放的引用变量已经不再指向任何一个有效的变量了,因此IS BOUND返回. 最后,因为施加了CLEAR操作, 又回到了初始化状态,所以IS 返回.

    一句话总结,就是:判断引用变量是否有效,用IS BOUND; 判断变量是否处于初始状态,用IS ; 判断field 是否分配有内存区域,用IS . 在对field 进行各种操作之前,先调用IS 进行判断,以避免错误。

    感谢阅读。

    ABAP专题

网站首页   |    关于我们   |    公司新闻   |    产品方案   |    用户案例   |    售后服务   |    合作伙伴   |    人才招聘   |   

地址:北京市海淀区    电话:010-     邮箱:@126.com

备案号:冀ICP备2024067069号-3 北京科技有限公司版权所有