映射函数返回了空值。

22

我将调试和发布的构建类型设置为相同。

buildTypes {
    debug {
        buildConfigField "String", "API_BASE_URL", "\"https://www.testUrl.com/api/\""
        minifyEnabled true
        shrinkResources true
        proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
        signingConfig signingConfigs.release_key
    }
    release {
        buildConfigField "String", "API_BASE_URL", "\"https://www.testUrl.com/api/\""
        minifyEnabled true
        shrinkResources true
        proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
        signingConfig signingConfigs.release_key
    }
}

但是如果我使用发布版本构建,我会得到以下错误。此外,服务器响应完全相同。

W/System.err: java.lang.NullPointerException: The mapper function returned a null value.
W/System.err:     at b.a.e.b.b.a(Unknown Source)
W/System.err:     at b.a.e.e.b.bs$a.onNext(Unknown Source)
W/System.err:     at b.a.e.e.b.cm$a.onNext(Unknown Source)
W/System.err:     at retrofit2.adapter.rxjava2.BodyObservable$BodyObserver.onNext(Unknown Source)
W/System.err:     at retrofit2.adapter.rxjava2.BodyObservable$BodyObserver.onNext(Unknown Source)
W/System.err:     at retrofit2.adapter.rxjava2.CallExecuteObservable.subscribeActual(Unknown Source)
W/System.err:     at b.a.l.subscribe(Unknown Source)
W/System.err:     at retrofit2.adapter.rxjava2.BodyObservable.subscribeActual(Unknown Source)
W/System.err:     at b.a.l.subscribe(Unknown Source)
W/System.err:     at b.a.e.e.b.cm$a.a(Unknown Source)
W/System.err:     at b.a.e.e.b.cm.subscribeActual(Unknown Source)
W/System.err:     at b.a.l.subscribe(Unknown Source)
W/System.err:     at b.a.e.e.b.bs.subscribeActual(Unknown Source)
W/System.err:     at b.a.l.subscribe(Unknown Source)
W/System.err:     at b.a.e.e.b.bw.subscribeActual(Unknown Source)
W/System.err:     at b.a.l.subscribe(Unknown Source)
W/System.err:     at b.a.e.e.b.dd$b.run(Unknown Source)
W/System.err:     at b.a.s$a.run(Unknown Source)
W/System.err:     at b.a.e.g.j.run(Unknown Source)
W/System.err:     at b.a.e.g.j.call(Unknown Source)
W/System.err:     at java.util.concurrent.FutureTask.run(FutureTask.java:237)
W/System.err:     at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.run(ScheduledThreadPoolExecutor.java:272)
W/System.err:     at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1133)
W/System.err:     at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:607)
W/System.err:     at java.lang.Thread.run(Thread.java:761)

你能否尝试在禁用proguard的发布版本上重现此问题? - Michael Dodd
@MichaelDodd 是的,它在禁用proguard时可以工作!那么在调试模式下它是如何工作的?它有相同的proguard设置。你能否请审核一下我的proguard规则? - Expert wanna be
Retrofit2的调用有时会导致返回一个null的响应体,然后无条件地转发给RxJava。您必须使用完整的Response<T>而不是直接检索。 - akarnokd
1个回答

23

问题出在 RxJava 2 上,它不允许将 null 值传递到流中。特别是在您的情况下,您有一个映射函数,返回了一个 null 值,这正是异常所指明的。

您可以使用以下代码片段重现该问题:


Observable.just(1)
          .map(integer -> null)
          .test()
          .assertError(throwable -> 
                "The mapper function returned a null value.".equals(throwable.getMessage()));

这段代码使用RxJava中的Observable构造一个简单的流,将1作为数据源,然后使用map操作符将其转换为null。最后通过test()方法创建一个测试用例并使用assertError()方法检查是否有错误,并通过Lambda表达式来检查错误消息是否包含"The mapper function returned a null value."。

27
主要问题在于这样的追踪无法确定哪张地图返回了空值。 - Benoit
2
实际上,您可以处理这种情况。有关更多信息,请参阅文章:https://rongi.github.io/kotlin-blog/rxjava/2017/09/25/breadcrumbs-rxjava-error-handling.html - cosic
7
  1. 我不明白为什么这个问题被标记为重复。
  2. 我不明白为什么没有答案可以帮助找到哪个地图返回了空值。
- nbroeking
1
RxJava 2.0中的空值处理:https://medium.com/@joshfein/handling-null-in-rxjava-2-0-10abd72afa0b - RefuX
@RefuX:“我不理解为什么这个问题被标记为重复。” 嗯,很多好的问题都被标记为重复。这是基于评审人员的懒惰 - 他们只会根据已知的关键词来作出反应 :( 我将这个问题标记为重新打开,请加入我。 - Honza Zidek

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接