asLody/VirtualApp · error · IllegalStateException

Initializer = NULL

Error message

Initializer = NULL

What it means

VirtualCore.initialize(VirtualInitializer) requires a non-null initializer object whose callbacks (onMainProcess/onVAppClientProcess/etc.) are invoked per process type. Passing null makes it impossible to dispatch per-process initialization, so the library throws this IllegalStateException.

Solutions

  1. Pass a concrete VirtualInitializer implementation implementing the callbacks needed for your process type
  2. If a process needs no special init, pass an empty VirtualInitializer instance instead of null
  3. Guard the call site: only invoke initialize() after the initializer object is constructed

Example fix

// before
VirtualCore.get().initialize(null);
// after
VirtualCore.get().initialize(new VirtualInitializer() {
    @Override public void onMainProcess() { }
    @Override public void onVAppClientProcess() { }
});
Defensive patterns

Strategy: validation

Validate before calling

VirtualInitializer init = provideInitializer(); if (init == null) init = new VirtualInitializer() { @Override public void onMainProcess() {} };
VirtualCore.get().initialize(init);

Type guard

VirtualInitializer safeInit(VirtualInitializer i) { return i != null ? i : new VirtualInitializer() {}; }

Try / catch

try { core.initialize(init); } catch (IllegalStateException e) { core.initialize(new VirtualInitializer() {}); }

Prevention

When it happens

Trigger: Calling VirtualCore.get().initialize(null) — typically a refactoring leftover or a conditional initializer variable that evaluated to null.

Common situations: Dependency-injected or config-driven initializer not constructed yet at init time; copy-pasted boilerplate call with the argument dropped.

Related errors


AI-assisted analysis of asLody/VirtualApp@666fefcb5d (2026-09-09). Data as JSON: /api/errors/dc14c6067d4578c0. Report an issue: GitHub.

Appendix: source

Thrown at VirtualApp/lib/src/main/java/com/lody/virtual/client/core/VirtualCore.java:230

    public boolean isEngineLaunched() {
        String engineProcessName = getEngineProcessName();
        ActivityManager am = (ActivityManager) context.getSystemService(Context.ACTIVITY_SERVICE);
        for (ActivityManager.RunningAppProcessInfo info : am.getRunningAppProcesses()) {
            if (info.processName.endsWith(engineProcessName)) {
                return true;
            }
        }
        return false;
    }

    public String getEngineProcessName() {
        return context.getString(R.string.engine_process_name);
    }

    public void initialize(VirtualInitializer initializer) {
        if (initializer == null) {
            throw new IllegalStateException("Initializer = NULL");
        }
        switch (processType) {
            case Main:
                initializer.onMainProcess();
                break;
            case VAppClient:
                initializer.onVirtualProcess();
                break;
            case Server:
                initializer.onServerProcess();
                break;
            case CHILD:
                initializer.onChildProcess();
                break;
        }
    }

    private void detectProcessType() {

View on GitHub (pinned to 666fefcb5d)