Skip to content

Commit ce21ecf

Browse files
VictorAlbertosakarnokd
authored andcommitted
Signal NPE ObservableAmb FlowableAmb (#4645)
1 parent d08266b commit ce21ecf

File tree

4 files changed

+46
-20
lines changed

4 files changed

+46
-20
lines changed

src/main/java/io/reactivex/internal/operators/flowable/FlowableAmb.java

+17-6
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@
1515

1616
import java.util.concurrent.atomic.*;
1717

18+
import io.reactivex.exceptions.Exceptions;
1819
import org.reactivestreams.*;
1920

2021
import io.reactivex.Flowable;
@@ -38,13 +39,23 @@ public void subscribeActual(Subscriber<? super T> s) {
3839
int count = 0;
3940
if (sources == null) {
4041
sources = new Publisher[8];
41-
for (Publisher<? extends T> p : sourcesIterable) {
42-
if (count == sources.length) {
43-
Publisher<? extends T>[] b = new Publisher[count + (count >> 2)];
44-
System.arraycopy(sources, 0, b, 0, count);
45-
sources = b;
42+
try {
43+
for (Publisher<? extends T> p : sourcesIterable) {
44+
if (p == null) {
45+
EmptySubscription.error(new NullPointerException("One of the sources is null"), s);
46+
return;
47+
}
48+
if (count == sources.length) {
49+
Publisher<? extends T>[] b = new Publisher[count + (count >> 2)];
50+
System.arraycopy(sources, 0, b, 0, count);
51+
sources = b;
52+
}
53+
sources[count++] = p;
4654
}
47-
sources[count++] = p;
55+
} catch (Throwable e) {
56+
Exceptions.throwIfFatal(e);
57+
EmptySubscription.error(e, s);
58+
return;
4859
}
4960
} else {
5061
count = sources.length;

src/main/java/io/reactivex/internal/operators/observable/ObservableAmb.java

+17-6
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@
1717

1818
import io.reactivex.*;
1919
import io.reactivex.disposables.Disposable;
20+
import io.reactivex.exceptions.Exceptions;
2021
import io.reactivex.internal.disposables.*;
2122
import io.reactivex.plugins.RxJavaPlugins;
2223

@@ -36,13 +37,23 @@ public void subscribeActual(Observer<? super T> s) {
3637
int count = 0;
3738
if (sources == null) {
3839
sources = new Observable[8];
39-
for (ObservableSource<? extends T> p : sourcesIterable) {
40-
if (count == sources.length) {
41-
ObservableSource<? extends T>[] b = new ObservableSource[count + (count >> 2)];
42-
System.arraycopy(sources, 0, b, 0, count);
43-
sources = b;
40+
try {
41+
for (ObservableSource<? extends T> p : sourcesIterable) {
42+
if (p == null) {
43+
EmptyDisposable.error(new NullPointerException("One of the sources is null"), s);
44+
return;
45+
}
46+
if (count == sources.length) {
47+
ObservableSource<? extends T>[] b = new ObservableSource[count + (count >> 2)];
48+
System.arraycopy(sources, 0, b, 0, count);
49+
sources = b;
50+
}
51+
sources[count++] = p;
4452
}
45-
sources[count++] = p;
53+
} catch (Throwable e) {
54+
Exceptions.throwIfFatal(e);
55+
EmptyDisposable.error(e, s);
56+
return;
4657
}
4758
} else {
4859
count = sources.length;

src/test/java/io/reactivex/flowable/FlowableNullTests.java

+6-4
Original file line numberDiff line numberDiff line change
@@ -55,20 +55,22 @@ public void ambIterableNull() {
5555
Flowable.amb((Iterable<Publisher<Object>>)null);
5656
}
5757

58-
@Test(expected = NullPointerException.class)
58+
@Test
5959
public void ambIterableIteratorNull() {
6060
Flowable.amb(new Iterable<Publisher<Object>>() {
6161
@Override
6262
public Iterator<Publisher<Object>> iterator() {
6363
return null;
6464
}
65-
}).blockingLast();
65+
}).test().assertError(NullPointerException.class);
6666
}
6767

6868
@SuppressWarnings("unchecked")
69-
@Test(expected = NullPointerException.class)
69+
@Test
7070
public void ambIterableOneIsNull() {
71-
Flowable.amb(Arrays.asList(Flowable.never(), null)).blockingLast();
71+
Flowable.amb(Arrays.asList(Flowable.never(), null))
72+
.test()
73+
.assertError(NullPointerException.class);
7274
}
7375

7476
@Test(expected = NullPointerException.class)

src/test/java/io/reactivex/observable/ObservableNullTests.java

+6-4
Original file line numberDiff line numberDiff line change
@@ -56,20 +56,22 @@ public void ambIterableNull() {
5656
Observable.amb((Iterable<Observable<Object>>)null);
5757
}
5858

59-
@Test(expected = NullPointerException.class)
59+
@Test
6060
public void ambIterableIteratorNull() {
6161
Observable.amb(new Iterable<Observable<Object>>() {
6262
@Override
6363
public Iterator<Observable<Object>> iterator() {
6464
return null;
6565
}
66-
}).blockingLast();
66+
}).test().assertError(NullPointerException.class);
6767
}
6868

6969
@SuppressWarnings("unchecked")
70-
@Test(expected = NullPointerException.class)
70+
@Test
7171
public void ambIterableOneIsNull() {
72-
Observable.amb(Arrays.asList(Observable.never(), null)).blockingLast();
72+
Observable.amb(Arrays.asList(Observable.never(), null))
73+
.test()
74+
.assertError(NullPointerException.class);
7375
}
7476

7577
@Test(expected = NullPointerException.class)

0 commit comments

Comments
 (0)