ABAP Keyword Documentation → ABAP - Reference → Declarative statemnts → Classes and Interfaces → Components in Classes and Interfaces → Methods → METHODS
METHODS - IMPORTING, EXPORTING, CHANGING, RAISING
Other versions: 7.31 | 7.40 | 7.54
Syntax
METHODS meth [ABSTRACT|FINAL]
[IMPORTING
parameters [PREFERRED PARAMETER p]]
[EXPORTING parameters]
[CHANGING parameters]
[{RAISING exc1|RESUMABLE(exc1) exc2|RESUMABLE(exc2) ...}
|{EXCEPTIONS exc1 exc2 ...}].
Extras
1. ... IMPORTING parameters [PREFERRED PARAMETER p]
2. ... EXPORTING parameters
3. ... CHANGING parameters
4. ... RAISING exc1|RESUMABLE(exc1) exc2|RESUMABLE(exc2) ...
5. ... EXCEPTIONS exc1 exc2 ...
6. ... ABSTRACT ...
7. ... FINAL ...
Effect
This statement declares a general instance method meth
. Use the additions ABSTRACT
and FINAL
to make the method abstract or final.
The additions IMPORTING
, EXPORTING
and CHANGING
define the
parameter interface of the method. After
every addition, the corresponding formal parameters are defined by a specification of the list
parameters
. The order of the additions is fixed.
The remaining additions define which exceptions are propagated or raised by the method.
Note
Within a method, you can use the logical expression IS SUPPLIED to check whether an actual parameter was assigned to an optional formal parameter at the call.
Addition 1
... IMPORTING parameters [PREFERRED PARAMETER p]
Effect
IMPORTING
defines input parameters. When calling the method, you need not
specify an appropriate actual parameter for every non-optional input parameter. The content of the actual
parameter is passed to the input parameter when the call is made. The content of an input parameter for which pass-by-reference is defined cannot be changed in the method.
Use PREFERRED PARAMETER
to identify an input parameter p1
p2 ... from the list parameters
after IMPORTING
as a preferred parameter. This specification makes sense
only if all input parameters are optional. The parameter specified after PREFERRED PARAMETER
is set to optional implicitly. When calling the method with the syntax
or when using a function
method accordingly in an operand position, then the actual parameter a
is assigned to the preferred parameter p
. PREFERRED PARAMETER
cannot be used if the method has output parameters or input/output parameters.
Addition 2
... EXPORTING parameters
Effect
EXPORTING
defines output parameters. When calling the method, you can specify
an appropriate actual parameter for every output parameter. The content of an output parameter defined for pass-by-value is passed to the actual parameter after the method has been completed successfully.
Note
An output parameter defined for pass-by-reference behaves like an input/output parameter, which means that it is not initialized when the method is called. For this reason, it should not be read before the first write access. In addition, be careful when adding content to such parameters as, for example, when inserting rows into internal tables.
Addition 3
... CHANGING parameters
Effect
CHANGING
defines input/output parameters. When calling the method, you must
specify an appropriate actual parameter for every non-optional input/output parameter. The content of
the actual parameter is passed to the input/output parameter at the call, and after the method has been completed, the content of the input/output parameter is passed to the actual parameter.
Example
The method read_spfli_into_table
of this example has an input and an output parameter, which are typed fully by reference to ABAP Dictionary.
PUBLIC SECTION.
METHODS read_spfli_into_table
IMPORTING VALUE(id) TYPE spfli-carrid
EXPORTING flight_tab TYPE spfli_tab.
...
ENDCLASS.
Addition 4
... RAISING exc1|RESUMABLE(exc1) exc2|RESUMABLE(exc2) ...
Effect
Use the addition RAISING
to declare the
class-based exceptions exc1 exc2 ...
that can be propagated from the method to the caller.
For exc1 exc2 ...
, all exception classes that are visible at this point that
are subclasses of CX_STATIC_CHECK or CX_DYNAMIC_CHECK can be specified here. You must specify the exception
classes in ascending order with respect to their inheritance hierarchy. Each exception class may only be specified once.
The RESUMABLE
addition declares an exception that can be propagated as a resumable exception. This means:
- A resumable exception is propagated as a resumable exception.
- The addition does not have any effect on a non-resumable exception.
-
If a resumable exception is propagated with
RAISING
without the additionRESUMABLE
, it thus becomes non-resumable.
If a superclass is declared as resumable, any subclasses must also be declared as resumable.
Exceptions in the categories CX_STATIC_CHECK and CX_DYNAMIC_CHECK must be explicitly declared, otherwise
a propagation can lead to an interface violation. A violation of the interface raises the handleable
exception CX_SY_NO_HANDLER. Exceptions of the category CX_NO_CHECK are always declared implicitly and with the RESUMABLE
addition.
Notes
- The declaration of exceptions of the category CX_STATIC_CHECK is checked statically in the syntax check. For exceptions of the category CX_DYNAMIC_CHECK, the check is not performed until runtime.
-
In a method in which class-based exceptions are declared with the addition
RAISING
, you cannot use the statementCATCH SYSTEM-EXCEPTIONS
. Instead, the relevant handleable exceptions should be handled in aTRY
control structure. -
An exception that is raised as resumable in the method with
RAISE RESUMABLE EXCEPTION
, should also be declared as resumable in the interface, since the exception would otherwise lose this property when you leave the method.
Example
In the class math
, you can propagate all exceptions represented by class
CX_SY_ARITHMETIC_ERROR and its subclasses from within method divide_1_by
.
If, for example, the input parameter operand
is filled by the call with the
value 0, then the exception CX_SY_ZERODIVIDE is raised, propagated, and can, as shown in the example, be handled by the caller in a TRY
control structure.
CLASS math DEFINITION.
PUBLIC SECTION.
METHODS divide_1_by
IMPORTING operand TYPE i
RETURNING value(result) TYPE decfloat34
RAISING cx_sy_arithmetic_error.
ENDCLASS.
CLASS math IMPLEMENTATION.
METHOD divide_1_by.
result = 1 / operand.
ENDMETHOD.
ENDCLASS.
DATA oref TYPE REF TO math.
DATA exc TYPE REF TO cx_sy_arithmetic_error.
DATA res TYPE decfloat34.
DATA text TYPE string.
START-OF-SELECTION.
CREATE OBJECT oref.
TRY.
res = oref->divide_1_by( 4 ).
text = res.
CATCH cx_sy_arithmetic_error INTO exc.
text = exc->get_text( ).
ENDTRY.
MESSAGE text TYPE 'I'.
Addition 5
... EXCEPTIONS exc1 exc2 ...
Effect
Use the addition EXCEPTIONS
to define a list of
non-class-based exceptions exc1
exc2... that can be raised by the statements
RAISE or MESSAGE RAISING
in the method. The names exc1 exc2 ...
for the exceptions are freely definable
and specified directly. Exceptions defined in this way are bound to the method (similar to formal parameters) and cannot be propagated.
If such an exception is raised in a method and no return code has been assigned to it in the addition
EXCEPTIONS
of the CALL METHOD
statement in the method call, then a runtime error occurs.
You cannot use the additions RAISING
and EXCEPTIONS
simultaneously. Furthermore, you are not allowed to use the statement
RAISE EXCEPTION
to raise a class-based exception in a method in whose interface non class-based exceptions are defined.
Note
For new developments, we recommend that you use class-based exceptions that are independent of the method in question.
Example
In the class math
, for method divide_1_by
, an
exception arith_error
is defined which is raised in the method by the
RAISE statement if an arithmetic error occurs. If, for example, the input parameter operand
is filled with value 0 by the call, the exception arith_error
is raised in
the internal method handling of exception CX_SY_ZERODIVIDE and handled after the call of the method
by evaluating sy-subrc
. The method cannot be called functionally due to the handling of the classical exception.
CLASS math DEFINITION.
PUBLIC SECTION.
METHODS divide_1_by
IMPORTING operand TYPE i
RETURNING VALUE(result) TYPE decfloat34
EXCEPTIONS arith_error.
ENDCLASS.
CLASS math IMPLEMENTATION.
METHOD divide_1_by.
TRY.
result = 1 / operand.
CATCH cx_sy_arithmetic_error.
RAISE arith_error.
ENDTRY.
ENDMETHOD.
ENDCLASS.
DATA res TYPE decfloat34.
DATA oref TYPE REF TO math.
START-OF-SELECTION.
CREATE OBJECT oref.
oref->divide_1_by( EXPORTING operand = 4
RECEIVING result = res
EXCEPTIONS arith_error = 4 ).
IF sy-subrc = 0.
WRITE res.
ELSE.
WRITE 'Arithmetic error!'.
ENDIF.
Addition 6
... ABSTRACT ...
Effect
Use the addition ABSTRACT
to define an abstract method meth
.
The addition ABSTRACT
is allowed only in abstract classes, not in interfaces.
An abstract method is not implemented in the implementation section of its class. To implement an abstract method, you must redefine it in a
specific subclass using addition REDEFINITION
.
Notes
- Abstract methods can be defined in classes that are either abstract or final, but they can never be implemented and therefore are not usable.
- Methods in interfaces are implicitly abstract, because interfaces do not contain method implementations.
-
With the exception of the instance constructor, concrete instance methods of a class can also call their abstract methods.
Addition 7
... FINAL ...
Effect
The addition FINAL
is allowed only in classes, not in interfaces. Use the
addition FINAL
to define a final method meth
.
A final method cannot be redefined in a subclass. In final classes, all methods are automatically final; the addition FINAL
is not allowed.