diff --git a/src/main/java/io/reactivex/rxjava4/internal/util/AppendOnlyLinkedArrayList.java b/src/main/java/io/reactivex/rxjava4/internal/util/AppendOnlyLinkedArrayList.java index 9a8ed49f69..24d2beae57 100644 --- a/src/main/java/io/reactivex/rxjava4/internal/util/AppendOnlyLinkedArrayList.java +++ b/src/main/java/io/reactivex/rxjava4/internal/util/AppendOnlyLinkedArrayList.java @@ -175,6 +175,9 @@ public void forEachWhile(S state, BiPredicate consumer } } a = (Object[])a[c]; + if (a == null) { + return; + } } } } diff --git a/src/test/java/io/reactivex/rxjava4/internal/util/MiscUtilTest.java b/src/test/java/io/reactivex/rxjava4/internal/util/MiscUtilTest.java index 535866d1dc..7caf41a06a 100644 --- a/src/test/java/io/reactivex/rxjava4/internal/util/MiscUtilTest.java +++ b/src/test/java/io/reactivex/rxjava4/internal/util/MiscUtilTest.java @@ -235,4 +235,23 @@ public void appendOnlyLinkedArrayListForEachWhileBiAll() throws Throwable { public void queueDrainHelperUtility() { TestHelper.checkUtilityClass(QueueDrainHelper.class); } + + @Test + public void appendOnlyLinkedArrayListForEachWhileBiFullChunkNoNext() throws Throwable { + // Fill exactly capacity elements in one chunk; no next chunk exists (a[c] == null). + // The predicate returns false for all elements so the loop must traverse past the full chunk. + AppendOnlyLinkedArrayList list = new AppendOnlyLinkedArrayList<>(2); + + list.add(1); + list.add(2); + + final List out = new ArrayList<>(); + + list.forEachWhile(null, (state, value) -> { + out.add(value); + return false; // never terminate early + }); + + assertEquals(Arrays.asList(1, 2), out); + } }