开发者社区> jerrywangsap> 正文
阿里云
为了无法计算的价值
打开APP
阿里云APP内打开

SAP ABAP一组关键字 IS BOUND, IS NOT INITIAL和IS ASSIGNED的用法辨析

简介:
+关注继续查看

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

先把SAP帮助文档抄过来:

IS BOUND

It checks whether a reference variable contains a valid reference. A data reference variable that contains a stack reference, on the other hand, can become invalid even if the reference data object is removed from the stack.

IS INITIAL
checks whether the operand operand is initial. The expression is true, if the operand contains its type-friendly initial value.

IS ASSIGNED
checks whether a memory area is assigned to a field symbol. The expression is true if the field symbol points to a memory area.

简单翻译成中文:

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

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

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

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

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

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

完整的测试代码:

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

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

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

IS ASSIGNED

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

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

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

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

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

答案是肯定的。

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

该报表打印输出如下:

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

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

感谢阅读。

ABAP专题

本文来自云栖社区合作伙伴“汪子熙”,了解相关信息可以关注微信公众号"汪子熙"。

版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

相关文章
SAP ABAP一组关键字 IS BOUND, IS NOT INITIAL和IS ASSIGNED的用法辨析
SAP ABAP一组关键字 IS BOUND, IS NOT INITIAL和IS ASSIGNED的用法辨析
0 0
ABAP COMMIT WORK关键字在CRM content management应用里的使用场景
Sent: Friday, November 29, 2013 4:14 PM Subject: 关于content management的commit work
0 0
ABAP REDUCE关键字的一些实际用途
ABAP REDUCE关键字的一些实际用途
0 0
ABAP关键字组合LOOP AT GROUP BY的用法
ABAP关键字组合LOOP AT GROUP BY的用法
0 0
SAP QM Quality Follow-up Actions的配置里'SyncUpdt'标记的作用?
SAP QM Quality Follow-up Actions的配置里'SyncUpdt'标记的作用?       'SyncUpdt'勾选,表明当QA11的标准事务和我们这个follow up都执行成功,才算是成功执行UD; 不勾选的话,意味着当QA11的标准事务完成而我们这个follow up没有执行成功,系统也认为整个UD成功被执行。
1227 0
ABAP中关键字TYPES与DATA
  TYPES关键字用于创建自定义数据类型,就像JAVA里面创建类一样,用TYPES创建的数据类型可以被其它变量引用(类似于实例化对象),而本身不能直接引用或者赋值。  DATA关键字用于定义结构体,可以自定义结构体或者参考某一个自定义类型创建对象,我把它称为实例化对象。
601 0
+关注
文章
问答
来源圈子
更多
+ 订阅
文章排行榜
最热
最新
相关电子书
更多
低代码开发师(初级)实战教程
立即下载
阿里巴巴DevOps 最佳实践手册
立即下载
冬季实战营第三期:MySQL数据库进阶实战
立即下载