{"record":{"id":"cd695fd008d7e538","repo":"apache/pulsar","slug":"unsupportedoperationexception","errorCode":null,"errorMessage":"UnsupportedOperationException","messagePattern":"UnsupportedOperationException","errorType":"exception","errorClass":"UnsupportedOperationException","httpStatus":null,"severity":"warning","filePath":"pulsar-common/src/main/java/org/apache/pulsar/common/util/collections/GrowableArrayBlockingQueue.java","lineNumber":366,"sourceCode":"        }\n\n        if (tailIndex > 0) {\n            data[tailIndex - 1] = null;\n        } else {\n            data[data.length - 1] = null;\n        }\n\n        SIZE_UPDATER.decrementAndGet(this);\n    }\n\n    @Override\n    public int size() {\n        return SIZE_UPDATER.get(this);\n    }\n\n    @Override\n    public Iterator<T> iterator() {\n        throw new UnsupportedOperationException();\n    }\n\n    public List<T> toList() {\n        List<T> list = new ArrayList<>(size());\n        forEach(list::add);\n        return list;\n    }\n\n    @Override\n    public void forEach(Consumer<? super T> action) {\n        long stamp = tailLock.writeLock();\n        headLock.lock();\n\n        try {\n            int headIndex = this.headIndex.value;\n            int size = this.size;\n\n            for (int i = 0; i < size; i++) {","sourceCodeStart":348,"sourceCodeEnd":384,"githubUrl":"https://github.com/apache/pulsar/blob/820761864ed8e2a7d2e52dd9763ad2ae117c1395/pulsar-common/src/main/java/org/apache/pulsar/common/util/collections/GrowableArrayBlockingQueue.java#L348-L384","documentation":"Deliberate UnsupportedOperationException from GrowableArrayBlockingQueue.iterator: this custom lock-free queue does not support snapshot iteration (its internal ring buffer mutates concurrently), so any caller attempting to iterate (e.g. via streams or for-each) is rejected; use forEach or toList instead.","triggerScenarios":"Using the queue in a for-each loop, passing it to code that calls iterator() (e.g. streams, collection copying, toString-based logging).","commonSituations":"Code that assumes every Collection is iterable (for (T t : queue) {...}) or library helpers that snapshot via iterator.","solutions":["Use forEach or toList to traverse elements"],"exampleFix":"// before\nfor (T item : queue) { process(item); } // throws\n// after\nfor (T item : queue.toList()) { process(item); }","handlingStrategy":"type-guard","validationCode":null,"typeGuard":null,"tryCatchPattern":"try {\n    for (T item : queue) { ... }\n} catch (UnsupportedOperationException e) {\n    queue.forEach(this::process); // supported alternative\n}","preventionTips":["Never use GrowableArrayBlockingQueue in for-each; use forEach or toList()","Check the class Javadoc before using Collection-derived methods","Pass consumers a List (toList()) instead of the queue when iteration is needed"],"tags":["java","unsupported-operation","iterator"],"backgroundTag":"unsupported-operation-iterator","analyzedSha":"820761864ed8e2a7d2e52dd9763ad2ae117c1395","analyzedAt":"2026-09-06T00:14:20.138Z","contentChangedAt":"2026-09-06T00:14:20.138Z","schemaVersion":2},"datasetVersion":"2026-09-14T00:17:10.932Z"}