Skip to content

2.x: SimpleQueue.offer on a null object reference #6224

@arturdryomov

Description

@arturdryomov

Versions:

  • RxJava: 2.2.2
  • RxRelay: 2.0.0
  • RxReplayingShare: 2.0.1

We got this rare issue which happens maybe once a month at best over all userbase. Unfortunately I wasn’t able to reproduce it locally.

The meaningful part of the stacktrace looks something like this.

Caused by java.lang.NullPointerException: Attempt to invoke interface method 'boolean io.reactivex.internal.fuseable.SimpleQueue.offer(java.lang.Object)' on a null object reference
       at io.reactivex.internal.operators.observable.ObservableSwitchMap$SwitchMapInnerObserver.onNext(ObservableSwitchMap.java:372)
       at io.reactivex.internal.operators.observable.ObservableMap$MapObserver.onNext(ObservableMap.java:62)
       at io.reactivex.internal.operators.observable.ObservableDistinctUntilChanged$DistinctUntilChangedObserver.onNext(ObservableDistinctUntilChanged.java:85)
       at com.jakewharton.rx.ReplayingShare$LastSeenObserver.onSubscribe(ReplayingShare.java:96)
       at io.reactivex.internal.operators.observable.ObservableRefCount$RefCountObserver.onSubscribe(ObservableRefCount.java:235)
       at io.reactivex.internal.operators.observable.ObservablePublish$PublishSource.subscribe(ObservablePublish.java:330)
       at io.reactivex.internal.operators.observable.ObservablePublish.subscribeActual(ObservablePublish.java:68)
       at io.reactivex.Observable.subscribe(Observable.java:12090)
       at io.reactivex.internal.operators.observable.ObservableRefCount.subscribeActual(ObservableRefCount.java:85)
       at io.reactivex.Observable.subscribe(Observable.java:12090)
       at com.jakewharton.rx.ReplayingShare$LastSeenObservable.subscribeActual(ReplayingShare.java:78)
       at io.reactivex.Observable.subscribe(Observable.java:12090)
       at io.reactivex.internal.operators.observable.ObservableDistinctUntilChanged.subscribeActual(ObservableDistinctUntilChanged.java:35)
       at io.reactivex.Observable.subscribe(Observable.java:12090)
       at io.reactivex.internal.operators.observable.ObservableMap.subscribeActual(ObservableMap.java:32)
       at io.reactivex.Observable.subscribe(Observable.java:12090)
       at io.reactivex.internal.operators.observable.ObservableSwitchMap$SwitchMapObserver.onNext(ObservableSwitchMap.java:127)
       at com.jakewharton.rxrelay2.BehaviorRelay$BehaviorDisposable.test(BehaviorRelay.java:354)
       at com.jakewharton.rxrelay2.BehaviorRelay$BehaviorDisposable.emitNext(BehaviorRelay.java:348)
       at com.jakewharton.rxrelay2.BehaviorRelay.accept(BehaviorRelay.java:127)
       at com.jakewharton.rxrelay2.SerializedRelay.accept(SerializedRelay.java:57)
       at package.internal.relay.accept

The code causing this looks something like this (at least I hope it does).

val value = BehaviorRelay.createDefault<Optional<Something>>(None).toSerialized()

val valueObservable = value
    .switchMap {
        when (it) {
            is Some -> it
            is None -> itemsObservable.map { it.transform() }
        }
    }
    .distinctUntilChanged()
    .replayingShare()

This is where I’m a bit lost. We have two subscriptions to the valueObservable which do further processing, observe on AndroidSchedulers.mainThread and write values to (very) dumb Consumer instances.

Not sure if any of it helps, but maybe you’ll have some ideas about potential issues with SimpleQueue. Or it is something else.

Metadata

Metadata

Assignees

No one assigned

    Labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions