Spring Boot 和 RxJava2 集成 - NullPointerException:实际上不是

Spring Boot and RxJava2 Integration - NullPointerException: Actually not

尝试从 Spring Boot ApplicationRunner 调用 RxJava2,我得到一个非常神秘的异常:

java.lang.IllegalStateException: Failed to execute ApplicationRunner
    at org.springframework.boot.SpringApplication.callRunner(SpringApplication.java:770)
    at org.springframework.boot.SpringApplication.callRunners(SpringApplication.java:757)
    at org.springframework.boot.SpringApplication.afterRefresh(SpringApplication.java:747)
    at org.springframework.boot.SpringApplication.run(SpringApplication.java:315)
    at org.springframework.boot.builder.SpringApplicationBuilder.run(SpringApplicationBuilder.java:134)
    at com.silanis.ps.dtool.Application.main(Application.java:37)
Caused by: java.lang.NullPointerException: Actually not, but can't throw other exceptions due to RS
    at io.reactivex.Flowable.subscribe(Flowable.java:12995)
    at io.reactivex.Flowable.subscribe(Flowable.java:12932)
    at io.reactivex.internal.operators.flowable.FlowableZip$ZipCoordinator.subscribe(FlowableZip.java:127)
    at io.reactivex.internal.operators.flowable.FlowableZip.subscribeActual(FlowableZip.java:79)
    at io.reactivex.Flowable.subscribe(Flowable.java:12986)
    at io.reactivex.internal.operators.flowable.FlowableDoOnEach.subscribeActual(FlowableDoOnEach.java:49)
    at io.reactivex.Flowable.subscribe(Flowable.java:12986)
    at io.reactivex.internal.operators.flowable.FlowableTake.subscribeActual(FlowableTake.java:32)
    at io.reactivex.Flowable.subscribe(Flowable.java:12986)
    at io.reactivex.internal.operators.flowable.FlowableDoOnEach.subscribeActual(FlowableDoOnEach.java:49)
    at io.reactivex.Flowable.subscribe(Flowable.java:12986)
    at io.reactivex.internal.operators.flowable.FlowableFlatMapSingle.subscribeActual(FlowableFlatMapSingle.java:54)
    at io.reactivex.Flowable.subscribe(Flowable.java:12986)
    at io.reactivex.Flowable.subscribe(Flowable.java:12935)
    at com.silanis.ps.dtool.services.CliRunner.run(CliRunner.java:61)
    at org.springframework.boot.SpringApplication.callRunner(SpringApplication.java:767)
    ... 5 common frames omitted
Caused by: java.lang.IllegalArgumentException: null
    at java.util.concurrent.ScheduledThreadPoolExecutor.scheduleAtFixedRate(ScheduledThreadPoolExecutor.java:565)
    at io.reactivex.internal.schedulers.NewThreadWorker.schedulePeriodicallyDirect(NewThreadWorker.java:91)
    at io.reactivex.internal.schedulers.ComputationScheduler.schedulePeriodicallyDirect(ComputationScheduler.java:139)
    at io.reactivex.internal.operators.flowable.FlowableInterval.subscribeActual(FlowableInterval.java:46)
    at io.reactivex.Flowable.subscribe(Flowable.java:12986)
    ... 20 common frames omitted

java.lang.NullPointerException: Actually not, but can't throw other exceptions due to RS 究竟是什么意思?

有关的事情
Caused by: java.lang.IllegalArgumentException: null
at java.util.concurrent.ScheduledThreadPoolExecutor.scheduleAtFixedRate(ScheduledThreadPoolExecutor.java:565)
at io.reactivex.internal.schedulers.NewThreadWorker.schedulePeriodicallyDirect(NewThreadWorker.java:91)

答案:

正如关于这个问题的评论中提到的,当 Flowable.interval 被初始化为 0 时会抛出这个错误。将值设置为正值解决了问题。

Caused by: java.lang.IllegalArgumentException: null

这不是一个非常有用的异常,但根据源代码,似乎在 period <= 0 时发生了异常。

由于您简化了代码,所以不清楚该值可能出现在哪里,但是当提供给 Flowable.interval 的句点为 0 或负数时,似乎会发生此错误。出于某种原因,RxJava 接受了 ThreadPoolExecutor 不接受的 0 周期。

编辑:当 RxJava 2.1.1 发布时,这个错误将被修复,如果 period <= 0.