CX_SY_CREATE_OBJECT_ERROR — CREATE OBJECT statement fails to instantiate a class
CX_SY_CREATE_OBJECT_ERROR is raised when a CREATE OBJECT statement cannot instantiate the requested class. Typical triggers: the class does not exist in the system, the class is abstract, the constructor is private or protected and inaccessible from the caller, or a dynamically resolved class name (from a variable or customizing table) points to something invalid. It is a structural failure, not a business logic exception raised inside the constructor.
This page covers the runtime error thrown when CREATE OBJECT cannot build an instance of a class, including dynamic instantiation via a type name variable. It focuses on separating structural instantiation failures from exceptions raised by constructor logic, since the two are frequently confused when a TRY block is written around CREATE OBJECT.
Published 16 Sept 2026· 1,241 words
What the dump means
This dump fires at the point a CREATE OBJECT statement executes, before any constructor logic has a chance to run business rules. ABAP has already failed to resolve the statement into a valid object reference. The exception is structural: the runtime cannot find the class, cannot access it, or is not allowed to build an instance of it as requested. This is distinct from a constructor that runs successfully but then raises its own exception class for a business reason – that case propagates the constructor’s own exception, not CX_SY_CREATE_OBJECT_ERROR. Seeing this specific class in ST22 means the failure happened in the instantiation mechanism itself, most often because the class name was supplied dynamically and turned out to be wrong, or because the static class referenced in the code cannot be created the way the statement asked.
Root causes that actually produce it
- Dynamic class name resolved at runtime does not exist: CREATE OBJECT ... TYPE (lv_classname) where lv_classname comes from a customizing table, BAdI implementation entry, workflow container, or output-determination configuration. The entry is wrong, was typed incorrectly, refers to a class that was deleted, or belongs to a transport that never reached this system. This is the most frequent cause in production because the failure only surfaces when that specific configuration path is exercised.
- Class is abstract: the code (or a dynamically resolved name) points at an abstract class rather than one of its concrete subclasses. Common after a refactor where the base class was made abstract and one caller was missed, or where a factory method that used to return the correct subclass was bypassed by a direct CREATE OBJECT.
- Constructor is not accessible: the class defines a PRIVATE or PROTECTED constructor as part of a singleton or factory pattern, and calling code outside the permitted scope tries a plain CREATE OBJECT instead of calling the designated static factory or GET_INSTANCE method.
- Class exists but is inconsistent or inactive in this system: present in one client or software component but not active, not released for the calling context, or missing because an add-on or business function that owns the class is not switched on.
- Cross-landscape or version mismatch: code was transported ahead of the class it depends on, so the class object does not yet exist in the target system, or exists in an older inactive version.
- RFC or remote-enabled instantiation attempted against a class that is not flagged for that use, surfacing as an instantiation error rather than a communication error.
What to inspect in ST22
- Runtime error name and short text at the top of ST22: the wording usually states the exact reason, e.g. class is abstract, class does not exist, or constructor not accessible - do not skip past this line.
- Error analysis section: names the class the runtime tried to instantiate and, for dynamic creation, the name of the variable that supplied it.
- Source code position: the exact CREATE OBJECT statement and its include/program, showing whether the class name is a literal or a variable.
- Double-click into the variable trace to see the actual string value held by the type-name variable at the moment of the dump, this is the fastest way to spot a typo or stale entry.
- Call stack: identify the calling program or function module, and whether it fetched the class name from a database table - go straight to that table in SE16 to check the entry.
- SE24 or the class browser: confirm the class exists in this system and client, check its abstract flag, its constructor visibility, and its activation status.
- SE03 or the transport logs if the class is missing entirely, to confirm whether the transport carrying it was released and imported.
Resolution path
If the class name was resolved dynamically from a customizing or configuration table, correct or remove the invalid entry - this is a configuration change and, if done in a controlled landscape, needs a change request to move the corrected entry through the transport path. If the class is abstract, fix the calling code to instantiate the correct concrete subclass, or route the call through the existing factory method if one exists - this is an ABAP code change requiring a transport. If the constructor is private or protected, replace the direct CREATE OBJECT with the intended static factory or singleton accessor method - again a code change. If the class is simply missing or inactive because of an incomplete transport, import the missing request or activate the class; this is a Basis/transport action, not a code fix, and should not be patched around in the calling program. If the mismatch is caused by an add-on or business function not being active, confirm licensing and activation with the functional team before assuming it is a technical defect.
The fix people try first (and why it fails)
The reflex fix is to wrap the CREATE OBJECT in TRY / CATCH CX_SY_CREATE_OBJECT_ERROR (or worse, CATCH CX_ROOT) and simply log or ignore it, letting execution continue without the object. This suppresses the dump but leaves the underlying configuration or code defect in place, and the downstream process silently does nothing useful - no output created, no follow-on document posted, no workflow step executed - with no visible error for anyone to chase. Catching CX_ROOT is worse still because it also swallows unrelated exceptions raised later in the same block, masking a different bug entirely.
Prevention
Where a class name is stored in a configuration table and read dynamically, validate it at maintenance time rather than at runtime - restrict the input help to existing, non-abstract, publicly instantiable classes, or run an existence check with the class description services before the CREATE OBJECT executes and raise a clear configuration error instead of letting the runtime dump. For factory or singleton patterns, keep the constructor private and document the required entry point so developers are not tempted to bypass it with a direct CREATE OBJECT.
Whose problem this is
Default owner is ABAP development, since the fix is almost always a code change or a class transport. If the class name comes from functional customizing (BAdI implementation, output determination, workflow), the functional consultant who maintains that configuration owns the correction of the entry. The handover note should state the class name involved, the source of the dynamic name if applicable, the system and client where it failed, and whether the class exists at all in that system.
Related SAP objects
Reviewed pages this object connects to in the ERPClimb knowledge graph.
Source: ERPClimb — https://erpclimb.com/sap-abap-dumps/cx-sy-create-object-errorERPClimb is an independent platform and is not affiliated with SAP SE. Reference pages are written and reviewed by SAP consultants for learning and troubleshooting.