如何修复映射器函数返回空值。”Java/RxJava2 Null 中的错误?

5 null stream mapper rx-java2

我对 RxJava2 和流(Observable 和 Observer)有一些问题实际上,我的流返回一个错误

The mapper function returned a null value.
io.reactivex.internal.functions.ObjectHelper.requireNonNull(ObjectHelper.java:39)
io.reactivex.internal.operators.observable.ObservableMap$MapObserver.onNext(ObservableMap.java:57)
retrofit2.adapter.rxjava2.BodyObservable$BodyObserver.onNext(BodyObservable.java:51)
retrofit2.adapter.rxjava2.BodyObservable$BodyObserver.onNext(BodyObservable.java:37)
retrofit2.adapter.rxjava2.CallExecuteObservable.subscribeActual(CallExecuteObservable.java:47)
Run Code Online (Sandbox Code Playgroud)

我的 logcat 不显示代码中断的位置。


 public static Observable<List<Business.Response.Doc>> streamArticles_Business() {
        NYT_TopStories_services nyt_services = NYT_TopStories_services.retrofit.create(NYT_TopStories_services.class);
        return nyt_services.getArticles_Business()
                .map(Business.Response::getDocs)
                .filter(str -> str != null)
                .subscribeOn(Schedulers.io())
                .observeOn(AndroidSchedulers.mainThread())
                .timeout(20, TimeUnit.SECONDS);
    }

Run Code Online (Sandbox Code Playgroud)

和我的改造得到

 @GET("search/v2/articlesearch.json?q=business&api-key=" + apiKey)
    Observable<Business.Response> getArticles_Business();


    Retrofit retrofit = new Retrofit.Builder()
            .baseUrl("https://api.nytimes.com/svc/")
            .addConverterFactory(GsonConverterFactory.create())
            .addCallAdapterFactory(RxJava2CallAdapterFactory.create())
            .build();


Run Code Online (Sandbox Code Playgroud)

你有办法解决这个问题吗?

doe*_*web 1

由于这是内部 RxJava 崩溃,因此您不会在代码中看到这一点,但是如果您遍历map{}层次结构,您就会了解其背后的原因。

如果您使用空值进行映射,就会发生这种崩溃,基本上,如果语句变成这样,map{null}它就会崩溃。解决此问题的一个简单方法是为所有可为空的类型设置默认值。

例如 :

map{nullableField ?: defaultValue}
Run Code Online (Sandbox Code Playgroud)