天天看點

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.

SAP ABAP一組關鍵字 IS BOUND, IS NOT INITIAL和IS ASSIGNED的用法辨析

IS ASSIGNED: 對于檢測的field symbol,該關鍵字判斷該field symbol是否配置設定有記憶體區域。

這三個關鍵字交織在一起,就形成了一些有趣的排列組合。

比如,是否存在NOT INITIAL, 但同時也NOT BOUND的變量?是否存在同時滿足IS INITIAL, NOT BOUND和IS ASSIGNED的field symbol? 下面我們用一個簡單的ABAP報表來研究這些排列組合。

完整的測試代碼:

SAP ABAP一組關鍵字 IS BOUND, IS NOT INITIAL和IS ASSIGNED的用法辨析

同時滿足NOT INITIAL和NOT BOUND的引用變量

下圖main方法裡,第15行在棧上定義了一個整型變量number,将其引用賦給類的成員變量dref. 待main方法執行之後,number所生存的棧幀被銷毀,是以dref指向的引用不再有效,調試器裡顯示為:FREED STACK.

SAP ABAP一組關鍵字 IS BOUND, IS NOT INITIAL和IS ASSIGNED的用法辨析

現在dref并不是未指向任何引用,而是指向一個無效的引用,是以dref同時滿足IS NOT INITIAL和IS NOT BOUND.

一個field symbol定義之後,如果不為其配置設定記憶體區域,則IS ASSIGNED傳回abap_false.

下面的代碼,如果注釋掉第27行的IF條件:

SAP ABAP一組關鍵字 IS BOUND, IS NOT INITIAL和IS ASSIGNED的用法辨析

運作時會抛出GETWA_NOT_ASSIGNED錯誤:Field symbol has not yet been assigned.

SAP ABAP一組關鍵字 IS BOUND, IS NOT INITIAL和IS ASSIGNED的用法辨析

也就是說,無論是讀取field symbol具體的内容,還是檢測其内容是否為初始值,為了避免GETWA_NOT_ASSIGNED錯誤,我們必須在IS INITIAL判斷之前,使用IS ASSIGNED判斷field symbol是否被配置設定了記憶體區域。

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

答案是肯定的。

SAP ABAP一組關鍵字 IS BOUND, IS NOT INITIAL和IS ASSIGNED的用法辨析

上面代碼第37行定義的名為的field symbol,在第45行的CLEAR操作完成之後,就同時滿足這三個條件。這個field symbol被配置設定的記憶體區域,内容并不是整型數本身,而是一個指向整型變量的引用。

該報表列印輸出如下:

SAP ABAP一組關鍵字 IS BOUND, IS NOT INITIAL和IS ASSIGNED的用法辨析

第40行代碼通過ASSIGN配置設定給的記憶體區域并未通過UNASSIGN釋放,是以 IS ASSIGNED始終傳回abap_true. 另一方面,這塊記憶體區域雖然還未釋放,但裡面存放的引用變量已經不再指向任何一個有效的變量了,是以IS BOUND傳回abap_false. 最後,因為施加了CLEAR操作, 又回到了初始化狀态,是以IS INITIAL傳回abap_true.

SAP ABAP一組關鍵字 IS BOUND, IS NOT INITIAL和IS ASSIGNED的用法辨析

一句話總結,就是:判斷引用變量是否有效,用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字元變量和字元串變量字元個數的一個知識點,和一個血案