sap abap开发从入门到精通_ABAP关键字 IS BOUND, IS NOT INITIAL和IS ASSIGNED的用法辨析

9d651a6bd57bdada5947fd28a545d8e1.png

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.

7f0d8bd1af670b55db3111890e60db75.png

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

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

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

完整的测试代码:

b0df126ffe5d2d591b6c13e95c351892.png

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

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

ab2fddc1db2547f5af69f67ee12877a7.png

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

IS ASSIGNED

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

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

e481991549a76d2f9f987c62193b243c.png

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

e2170c19414fb88e942aa14ed261ae42.png

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

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

答案是肯定的。

ad5f1796d4316ce8d970ee0c9731aa84.png

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

该报表打印输出如下:

11a638794d912f10cd0360092c667f7a.png

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

1bab7dbc0598662520e1e15371fa2d50.png

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

感谢阅读。

ABAP专题

  • Jerry的ABAP, Java和JavaScript乱炖
  • ABAP开发人员未来应该学些什么
  • Jerry 2017年的五一小长假:8种经典排序算法的ABAP实现
  • Jerry的ABAP原创技术文章合集
  • 300行ABAP代码实现一个最简单的区块链原型
  • 使用Java+SAP云平台+SAP Cloud Connector调用ABAP On-Premise系统里的函数
  • 在SAP云平台的CloudFoundry环境下消费ABAP On-Premise OData服务
  • ABAP vs Java, 蛙泳 vs 自由泳
  • 聊聊C语言和ABAP
  • 动手使用ABAP Channel开发一些小工具,提升日常工作效率
  • 我用ABAP做过的那些无聊的事情
  • 不喜欢SAP GUI?那试试用Eclipse进行ABAP开发吧
  • 使用Visual Studio Code编写和激活ABAP代码
  • 你的ABAP程序给佛祖开过光么?来试试Jerry这个小技巧
  • 在SAP云平台ABAP编程环境上编写第一段ABAP程序
  • SAP官方发布的ABAP编程规范
  • ABAP Code Inspector那些隐藏的功能,您都知道吗?
  • 还在用ABAP进行SAP产品的二次开发?来了解下这种全新的二次开发理念吧
  • ABAP Netweaver体内的那些寄生式编程语言
  • 从SAP社区上的一篇博客开始,聊聊SAP产品命名背后的那份情怀
  • 云端的ABAP Restful服务开发
  • 如何在SAP云平台ABAP编程环境里把CDS view暴露成OData服务
  • 使用abapGit在ABAP On-Premises系统和SAP云平台ABAP环境之间进行代码传输
  • 30分钟用Restful ABAP Programming模型开发一个支持增删改查的Fiori应用
  • Jerry带您了解Restful ABAP Programming模型系列之二:Action和Validation的实现
  • Jerry带您了解Restful ABAP Programming模型系列之三:云端ABAP应用调试
  • SAP云平台上的ABAP编程环境里如何消费第三方服务
  • ABAP开发者上云的时候到了 - 现在大家可以免费使用SAP云平台ABAP环境的试用版了
  • 学而不思则罔 - SAP云平台ABAP编程环境的由来和适用场景
  • SAP云平台里的三叉戟应用
  • 如何基于Restful ABAP Programming模型开发并部署一个支持增删改查的Fiori应用
  • SAP 2019 TechEd Key Note解读:云时代下SAP从业人员如何做二次开发?
  • 有哪些ABAP关键字和语法,到了ABAP云环境上就没办法用了?
  • ABAP开发环境终于支持以驼峰命名法自动格式化ABAP变量名了
  • 利用ABAP 740的新关键字REDUCE完成一个实际工作任务
  • 一段让人瑟瑟发抖的ABAP代码
  • 昨日万圣节ABAP怪兽级代码谜团,公布答案啦
  • 介绍一种在ABAP内核态进行内表高效拷贝的方法
  • 使用SAP Cloud Application Programming模型开发OData的一个实际例子
  • 当ABAP遇见普罗米修斯
  • 使用ABAP绘制可伸缩矢量图
  • ABAP开发环境语法高亮的那些事儿
  • SAP错误消息调试之七种武器:让所有的错误消息都能被定位
  • 使用ABAP操作Excel的几种方法
  • SAP GUI里的收藏夹事务码管理工具
  • SAP GUI和Windows注册表
  • 有了Debug权限就能干坏事?小心了,你的一举一动尽在系统监控中
  • ABAP CCDEF, CCIMP, CCMAC, CCAU, CMXXX这些东东是什么鬼
  • 实现ABAP条件断点的三种方式
  • 使用SAT跟踪监控从浏览器打开的SAP应用的性能和调用栈
  • 一个13年ABAP老兵的建议:了解这些基础知识,对ABAP开发有百利而无一害
  • SAP ABAP Netweaver容器化, 不可能完成的任务吗?
  • SAP产品增强技术回顾
  • SAP API开发方法大全
  • 浅谈Java和SAP ABAP的静态代理和动态代理,以及ABAP面向切面编程的尝试
  • SAP ABAP应用服务器的HTTP响应状态码(Status Code)
  • SAP ABAP里存在Java List这种集合工具类么?CL_OBJECT_COLLECTION了解一下
  • ABAP面试题系列:写一组会出现死锁(Deadlock)的ABAP程序
  • SAP ABAP Netweaver服务器的标准登录方式讲解
  • SAP ABAP关键字语法图和ABAP代码自动生成工具Code Composer
  • SAP ABAP SM50的另类用途 - ABAP工作进程对数据库表读取操作的检测
  • 关于SAP ABAP字符变量和字符串变量字符个数的一个知识点,和一个血案

要获取更多Jerry的原创文章,请关注公众号"汪子熙":

b656479b8ecf10e15db8d643929b949c.png
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值