{"record":{"id":"caa1cfc1f1a9718b","repo":"quarkusio/quarkus","slug":"listener-must-not-be-null","errorCode":null,"errorMessage":"listener must not be null","messagePattern":"listener must not be null","errorType":"exception","errorClass":"IllegalArgumentException","httpStatus":null,"severity":"error","filePath":"independent-projects/qute/core/src/main/java/io/quarkus/qute/TraceManagerImpl.java","lineNumber":29,"sourceCode":" *\n */\nclass TraceManagerImpl implements TraceManager {\n\n    private final List<TraceListener> listeners;\n\n    TraceManagerImpl() {\n        listeners = new CopyOnWriteArrayList<>();\n    }\n\n    /**\n     * Registers a new trace listener.\n     *\n     * @param listener the listener to add\n     */\n    @Override\n    public void addTraceListener(TraceListener listener) {\n        if (listener == null) {\n            throw new IllegalArgumentException(\"listener must not be null\");\n        }\n        listeners.add(listener);\n    }\n\n    /**\n     * Removes a previously registered trace listener.\n     *\n     * @param listener the listener to remove\n     */\n    @Override\n    public void removeTraceListener(TraceListener listener) {\n        if (listener == null) {\n            throw new IllegalArgumentException(\"listener must not be null\");\n        }\n        listeners.remove(listener);\n    }\n\n    /**","sourceCodeStart":11,"sourceCodeEnd":47,"githubUrl":"https://github.com/quarkusio/quarkus/blob/e1c734241f34c7919086ceb4c9262b4a58f6de44/independent-projects/qute/core/src/main/java/io/quarkus/qute/TraceManagerImpl.java#L11-L47","documentation":"TraceManagerImpl.addTraceListener rejects null listeners with IllegalArgumentException. The trace manager keeps a list of listeners notified on template lifecycle events, and a null entry would break event dispatch.","triggerScenarios":"Calling engine.getTraceManager().addTraceListener(null), often when the listener is the result of an unassigned field, an unresolved bean/lookup, or an optional callback that is null.","commonSituations":"CDI injection returning null (e.g. @Inject field not satisfied in tests), a config-driven listener that failed to instantiate, or passing a lambda stored in a nullable holder.","solutions":["Ensure a non-null TraceListener instance is constructed before registration.","If the listener is optional, guard with a null check and skip registration.","Verify the listener bean/lookup actually resolves (e.g. CDI select returns a bean) before adding."],"exampleFix":"// before\nTraceListener listener = config.listenerOrNull();\ntraceManager.addTraceListener(listener); // NPE source: null\n\n// after\nTraceListener listener = config.listenerOrNull();\nif (listener != null) {\n    traceManager.addTraceListener(listener);\n}","handlingStrategy":"validation","validationCode":"if (listener == null) {\n    return; // or log a warning: no trace listener configured\n}\ntraceManager.addTraceListener(listener);","typeGuard":"static boolean isValidListener(TraceListener l) {\n    return l != null;\n}","tryCatchPattern":"try {\n    traceManager.addTraceListener(listener);\n} catch (IllegalArgumentException e) {\n    if (\"listener must not be null\".equals(e.getMessage())) {\n        // skip registration; listener was not configured\n    } else {\n        throw e;\n    }\n}","preventionTips":["Null-check optional listeners before registration","Ensure CDI/config-provided listeners actually resolve","Fail fast with a clear log message when a configured listener cannot be created"],"tags":["qute","null-check","illegal-argument","tracing"],"backgroundTag":"null-listener-argument","analyzedSha":"e1c734241f34c7919086ceb4c9262b4a58f6de44","analyzedAt":"2026-09-05T17:01:29.979Z","contentChangedAt":"2026-09-05T17:01:29.979Z","schemaVersion":2},"datasetVersion":"2026-09-12T22:17:10.623Z"}