SAP ABAP一组关键字 IS BOUND, IS NOT INITIAL和IS ASSIGNED的用法辨析-阿里云开发者社区

开发者社区> 开发者小助手-bz4> 正文

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

简介: 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.

image.png

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


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


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


完整的测试代码:

image.png

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


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

image.png

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


IS ASSIGNED


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


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


image.png

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

image.png

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


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


答案是肯定的。


image.png

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

该报表打印输出如下:

image.png

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


image.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字符变量和字符串变量字符个数的一个知识点,和一个血案


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

相关文章
阿里云服务器怎么设置密码?怎么停机?怎么重启服务器?
如果在创建实例时没有设置密码,或者密码丢失,您可以在控制台上重新设置实例的登录密码。本文仅描述如何在 ECS 管理控制台上修改实例登录密码。
9209 0
synchronized关键字的用法?
synchronized关键字可以将对象或者方法标记为同步,以实现对对象和方法的互斥访问,可以用synchronized(对象) { … }定义同步代码块,或者在声明方法时将synchronized作为方法的修饰符。
821 0
阿里云服务器端口号设置
阿里云服务器初级使用者可能面临的问题之一. 使用tomcat或者其他服务器软件设置端口号后,比如 一些不是默认的, mysql的 3306, mssql的1433,有时候打不开网页, 原因是没有在ecs安全组去设置这个端口号. 解决: 点击ecs下网络和安全下的安全组 在弹出的安全组中,如果没有就新建安全组,然后点击配置规则 最后如上图点击添加...或快速创建.   have fun!  将编程看作是一门艺术,而不单单是个技术。
10763 0
Java 中的final关键字有哪些用法?
(1)修饰类:表示该类不能被继承; (2)修饰方法:表示方法不能被重写; (3)修饰变量:表示变量只能一次赋值以后值不能被修改(常量)。
1065 0
阿里云服务器如何登录?阿里云服务器的三种登录方法
购买阿里云ECS云服务器后如何登录?场景不同,阿里云优惠总结大概有三种登录方式: 登录到ECS云服务器控制台 在ECS云服务器控制台用户可以更改密码、更换系.
12911 0
阿里云ECS云服务器初始化设置教程方法
阿里云ECS云服务器初始化是指将云服务器系统恢复到最初状态的过程,阿里云的服务器初始化是通过更换系统盘来实现的,是免费的,阿里云百科网分享服务器初始化教程: 服务器初始化教程方法 本文的服务器初始化是指将ECS云服务器系统恢复到最初状态,服务器中的数据也会被清空,所以初始化之前一定要先备份好。
11478 0
JAVA学习笔记:STATIC关键字的使用方法
static作为java的关键字,主要有以下5点用处: 静态变量 ,静态方法,静态代码块,内部静态类,静态导包
7052 0
2315
文章
0
问答
来源圈子
更多
+ 订阅
文章排行榜
最热
最新
相关电子书
更多
《2021云上架构与运维峰会演讲合集》
立即下载
《零基础CSS入门教程》
立即下载
《零基础HTML入门教程》
立即下载