COBOL2002 Javaプログラム呼び出し機能ガイド


3.2.4 例外処理のコーディング

ここでは,サービスルーチンで検知するJava例外とサービスルーチンで検知しないJava例外について説明します。

〈この項の構成〉

(1) サービスルーチンで検知するJava例外の処理

次のサービスルーチンでは,Javaプログラムから例外がスローされたことで,サービスルーチンの呼び出しが失敗で終了することがあります。

Javaプログラムから例外がスローされた場合,CBLJENV集団項目のCBLJEXCEPTION項目にスローされた例外オブジェクトを設定し,RETURN-CODE特殊レジスタに1を返します。

RETURN-CODE特殊レジスタが0でない場合は,CBLJEXCEPTION項目の例外オブジェクトを使って例外処理をしてください。

インスタンスメソッドを呼び出す例について説明します。

           COMPUTE ARGPTR(1) = FUNCTION ADDR( ARG-STRING ).
           COMPUTE ARGPTR(2) = ZERO.
       
           CALL 'CBLJINVOKE' USING CBLJENV
                   OBJREF SampleMethod ARG-LIST  RTN-INT.
 
           IF RETURN-CODE NOT = 0
    
     *>        CBLJEXCEPTIONを使った例外処理をここに記述する。
    
               CALL 'CBLJFINALIZE' USING CBLJENV                       *> ※1
               MOVE  nnnn TO ABN-CODE
               CALL 'CBLABN' USING ABN-CODE                            *> ※2
           END-IF.
注※1

Javaプログラム呼び出し機能の実行環境の終了処理の呼び出しを示します。

注※2

COBOLプログラムを異常終了(終了コードはnnnn)させるサービスルーチンの呼び出しを示します。

CBLJEXCEPTIONを使った例外処理では,CBLJEXCEPTION項目を使って例外オブジェクトの種別判定や例外オブジェクトのメソッド呼び出しまたはフィールドアクセスを実行します。

この例では※1,※2の呼び出しによってCOBOLプログラムを終了していますが,続行できる例外ならば続行させてもかまいません。

なお,例外処理中にメソッドを呼び出す場合は,CBLJCOPYサービスルーチンを使って,CBLJEXCEPTION項目の例外オブジェクトのオブジェクト参照を退避してください。メソッド呼び出しのサービスルーチンは,CBLJEXCEPTION項目を更新します。

       01 EXP-OBJ           USAGE POINTER.
       01 EXP-CLS           USAGE POINTER VALUE NULL.
       01 EXP-TOSTRING      PIC X DYNAMIC C-STRING VALUE 'toString'.
       01 EXP-STRING.
         02  EXP-STR-TYPE    PIC X(256) VALUE 'Ljava/lang/String;'.
         02  EXP-STR-AREA    USAGE POINTER.
 
      *>      例外オブジェクトのメソッドtoString()を呼び出して
      *>      情報を取得する
              CALL 'CBLJCOPY'   USING CBLJENV
                                      CBLJEXCEPTION EXP-OBJ EXP-CLS.
              CALL 'CBLJINVOKE' USING CBLJENV EXP-OBJ
                                      EXP-TOSTRING NO-ARG EXP-STRING.

CBLJEXCEPTION項目を使って発生した例外オブジェクトの種別を判定する例を次に示します。

(2) サービスルーチンで検知しないJava例外

サービスルーチンで検知しないJava例外の場合,Javaプログラムで例外が発生したとき,COBOLプログラムのスレッドまたはプロセスが終了します。

この場合の対処については,「5 プログラムのデバッグとトラブルシュート」を参照してください。