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行定義的名為<any2>的field symbol,在第45行的CLEAR操作完成之後,就同時滿足這三個條件。這個field symbol被分配的記憶體區域,內容並不是整型數本身,而是一個指向整型變數的引用。
該報表列印輸出如下:
第40行程式碼透過ASSIGN分配給<any2>的記憶體區域並未透過UNASSIGN釋放,因此<any2> IS ASSIGNED始終返回abap_true. 另一方面,這塊記憶體區域雖然還未釋放,但裡面存放的引用變數已經不再指向任何一個有效的變數了,因此IS BOUND返回abap_false. 最後,因為<any2>施加了CLEAR操作, 又回到了初始化狀態,所以IS INITIAL返回abap_true.
一句話總結,就是:判斷引用變數是否有效,用IS BOUND; 判斷變數是否處於初始狀態,用IS INITIAL; 判斷field symbol是否分配有記憶體區域,用IS ASSIGNED. 在對field symbol進行各種操作之前,先呼叫IS ASSIGNED進行判斷,以避免GETWA_NOT_ASSIGNED錯誤。
感謝閱讀。
ABAP專題
要獲取更多Jerry的原創文章,請關注公眾號"汪子熙":
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/24475491/viewspace-2702901/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- 有趣的CSS題目(15): 談談 CSS 關鍵字 initial、inherit 和 unsetCSS
- 【C#】as關鍵字的用法C#
- java中this關鍵字的用法Java
- ABAP Netweaver 和 ABAP Platform 這兩個名詞的辨析Platform
- ORACLE中ESCAPE關鍵字用法Oracle
- SQL INNER JOIN 關鍵字 用法SQL
- java構造方法-this關鍵字的用法Java構造方法
- java中native關鍵字的用法Java
- out關鍵字和ref關鍵字的區別
- SAP ABAP關鍵字語法圖和ABAP程式碼自動生成工具Code Composer
- C語言中的關鍵字“ volatile”的用法C語言
- Python3 關鍵字nonlocal和global的用法與區別Python
- 資料庫SQL語句中關於explain關鍵字的用法資料庫SQLAI
- C++11 noexcept 關鍵字用法學習C++
- 【轉】C#中base關鍵字的幾種用法C#
- PHP static 關鍵字和 self 關鍵字例項化的區別PHP
- 詳解C++的模板中typename關鍵字的用法C++
- 詳解 C++ 的模板中 typename 關鍵字的用法C++
- SAP ABAP COMMIT WORK 關鍵字的一些使用要點MIT
- js關鍵字和方法JS
- 關鍵字和保留字
- ABAP的include關鍵字,Java的import, C的include和C4C ABSL 的import比較JavaImport
- Java開發筆記(五十五)關鍵字static的用法Java筆記
- PostgreSQL 資料庫中 DISTINCT 關鍵字的 4 種用法SQL資料庫
- JavaScript的關鍵字和保留字大全JavaScript
- Java中的關鍵字和保留字Java
- JavaScript 關鍵字和保留字JavaScript
- javascript 作用域和 this 關鍵字JavaScript
- typedef和typename關鍵字 (轉)
- ABAP 辨析ON INPUT|REQUEST|CHAIN-INPUT|CHAIN-REQUESTAI
- Java開發筆記(四十九)關鍵字super的用法Java筆記
- 關鍵字、Package 包的使用、import 的用法 - Go 學習記錄PackageImportGo
- c#—OpenFileDialog(開啟檔案對話方塊)和new關鍵字的用法C#
- 利用ABAP 740的新關鍵字REDUCE完成一個實際工作任務
- javascript的this關鍵字JavaScript
- java中的static和final關鍵字Java
- MySQL 5.7中的關鍵字和保留字MySql
- 資料庫關鍵詞 drop、truncate和delete的用法資料庫delete