Java 可观测的。take()引起NPE

Java 可观测的。take()引起NPE,java,rx-java,rx-java2,Java,Rx Java,Rx Java2,我有这样一个简单的程序: public class MainApp { public static void main(String[] args) { getAcronyms() .flatMap(Observable::fromIterable) .flatMap(MainApp::getTitle) .filter(Objects::nonNull)

我有这样一个简单的程序:

public class MainApp {
    public static void main(String[] args) {
        getAcronyms()
                .flatMap(Observable::fromIterable)
                .flatMap(MainApp::getTitle)
                .filter(Objects::nonNull)
                .subscribe(System.out::println);

    }

    private static Observable<List<String>> getAcronyms(){
        List<String> strings = new ArrayList<>();
        strings.add("YOLO");
        strings.add("LMAO");
        strings.add("ROFL");
        strings.add("AYY LMAO");
        return new Observable<List<String>>() {
            @Override
            protected void subscribeActual(Observer<? super List<String>> observer) {
                observer.onNext(strings);
                observer.onComplete();
            }
        };
    }

    private static Observable<String> getTitle(String url) {
        return new Observable<String>() {
            @Override
            protected void subscribeActual(Observer<? super String> observer) {
                observer.onNext(url + " title!");
                observer.onComplete();
            }
        };
    }
}
它打印2个值,但给我一个NPE:

约罗头衔

LMAO标题

线程“main”java.lang.NullPointerException中的异常位于 io.reactivex.internal.operators.observable.ObservableTake$TakeObserver.onComplete(ObservableTake.java:83) 在 io.reactivex.internal.operators.observable.ObservableTake$TakeObserver.onNext(ObservableTake.java:64) 在 io.reactivex.internal.operators.observable.ObservableFilter$FilterObserver.onNext(ObservableFilter.java:52) 在 io.reactivex.internal.operators.observable.ObservableFlatMap$mergeobservator.tryEmit(ObservableFlatMap.java:262) 在 io.reactivex.internal.operators.observable.ObservableFlatMap$InnerObserver.onNext(ObservableFlatMap.java:559) 在MainApp$2.subscribebeactual(MainApp.java:41)在 io.reactivex.Observable.subscribe(Observable.java:10842)位于 io.reactivex.internal.operators.observable.ObservableFlatMap$mergeobservator.subscribeInner(ObservableFlatMap.java:162) 在 io.reactivex.internal.operators.observable.ObservableFlatMap$MergeObserver.onNext(ObservableFlatMap.java:139) 在 io.reactivex.internal.operators.observable.ObservableFlatMap$MergeObserver.drainLoop(ObservableFlatMap.java:436) 在 io.reactivex.internal.operators.observable.ObservableFlatMap$MergeObserver.drain(ObservableFlatMap.java:323) 在 io.reactivex.internal.operators.observable.ObservableFlatMap$InnerObserver.onSubscribe(ObservableFlatMap.java:546) 在 io.reactivex.internal.operators.observable.observablefromitrable.subscribeActual(observablefromitrable.java:55) 在io.reactivex.Observable.subscribe(Observable.java:10842)处 io.reactivex.internal.operators.observable.ObservableFlatMap$mergeobservator.subscribeInner(ObservableFlatMap.java:162) 在 io.reactivex.internal.operators.observable.ObservableFlatMap$MergeObserver.onNext(ObservableFlatMap.java:139) 在MainApp$1.subscribebeactual(MainApp.java:31)在 io.reactivex.Observable.subscribe(Observable.java:10842)位于 io.reactivex.internal.operators.observable.ObservableFlatMap.subscribeActual(ObservableFlatMap.java:55) 在io.reactivex.Observable.subscribe(Observable.java:10842)处 io.reactivex.internal.operators.observable.ObservableFlatMap.subscribeActual(ObservableFlatMap.java:55) 在io.reactivex.Observable.subscribe(Observable.java:10842)处 io.reactivex.internal.operators.observable.ObservableFilter.subscribeActual(ObservableFilter.java:30) 在io.reactivex.Observable.subscribe(Observable.java:10842)处 io.reactivex.internal.operators.observable.ObservableTake.subscribeActual(ObservableTake.java:30) 在io.reactivex.Observable.subscribe(Observable.java:10842)处 io.reactivex.Observable.subscribe(Observable.java:10828)位于 io.reactivex.Observable.subscribe(Observable.java:10731)位于 MainApp.main(MainApp.java:18)


有人能帮我弄清楚为什么会发生这种情况以及我做错了什么吗?

发生这种异常的原因是
take
,在发出定义数量的项目后,内部尝试处置未设置的
一次性
对象

因此,在创建初始
observatable
时,必须通过调用
observator.onSubscribe(disposable)
内部
subscribebeactual
方法实现来提供它。但是不要重新发明轮子,而且通过调用其公共构造函数来创建一个可观察的
,是为自定义操作符准备的。只需使用静态工厂方法。在您的情况下,最好的选择是
可观察。fromCallable

private static Observable<List<String>> getAcronyms(){
    return Observable.fromCallable(new Callable<List<String>>() {
        @Override
        public List<String> call() throws Exception {
            List<String> strings = new ArrayList<>();
            strings.add("YOLO");
            strings.add("LMAO");
            strings.add("ROFL");
            strings.add("AYY LMAO");
            return strings;
        }
    });
}
private static Observable getAcronyms(){
返回Observable.fromCallable(newcallable()){
@凌驾
公共列表调用()引发异常{
列表字符串=新的ArrayList();
字符串。添加(“YOLO”);
字符串。添加(“LMAO”);
字符串。添加(“ROFL”);
字符串。添加(“AYY LMAO”);
返回字符串;
}
});
}
另请查看本文:

private static Observable<List<String>> getAcronyms(){
    return Observable.fromCallable(new Callable<List<String>>() {
        @Override
        public List<String> call() throws Exception {
            List<String> strings = new ArrayList<>();
            strings.add("YOLO");
            strings.add("LMAO");
            strings.add("ROFL");
            strings.add("AYY LMAO");
            return strings;
        }
    });
}