【发布时间】:2019-12-26 23:52:09
【问题描述】:
我正在尝试在 Kotlin 中从 RxJava 实现 BiFunction 接口,我得到了一个 NullPointerException。
这是我在 Kotlin 中实现的 Java 接口。它来自 RxJava 2。
package io.reactivex.functions;
import io.reactivex.annotations.NonNull;
/**
* A functional interface (callback) that computes a value based on multiple input values.
* @param <T1> the first value type
* @param <T2> the second value type
* @param <R> the result type
*/
public interface BiFunction<T1, T2, R> {
/**
* Calculate a value based on the input values.
* @param t1 the first value
* @param t2 the second value
* @return the result value
* @throws Exception on error
*/
@NonNull
R apply(@NonNull T1 t1, @NonNull T2 t2) throws Exception;
}
这是我的实现
class MonitoringStateReducer: BiFunction<MonitoringViewState, MonitoringResult,
MonitoringViewState> {
override fun apply(
previousState: MonitoringViewState,
result: MonitoringResult
): MonitoringViewState {
when (result) {
//Returns a non-null new state
}
}
}
然后,在 ViewModel 中,我尝试使用它,但它会引发 NullPointerException。
2019-08-22 09:57:41.049 6925-6925/com.name.app E/AndroidRuntime: 致命例外:主要 进程:com.name.app,PID:6925 java.lang.RuntimeException:无法启动活动 ComponentInfo{com.name.app/com.name.app.features.monitoring.presentation.MonitoringActivity}: java.lang.NullPointerException:累加器为空 在 android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2907) 在 android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2986) 在 android.app.ActivityThread.-wrap11(未知来源:0) 在 android.app.ActivityThread$H.handleMessage(ActivityThread.java:1641) 在 android.os.Handler.dispatchMessage(Handler.java:105) 在 android.os.Looper.loop(Looper.java:164) 在 android.app.ActivityThread.main(ActivityThread.java:6694) 在 java.lang.reflect.Method.invoke(本机方法) 在 com.android.internal.os.Zygote$MethodAndArgsCaller.run(Zygote.java:240) 在 com.android.internal.os.ZygoteInit.main(ZygoteInit.java:769) 引起:java.lang.NullPointerException:累加器为空 在 io.reactivex.internal.functions.ObjectHelper.requireNonNull(ObjectHelper.java:39) 在 io.reactivex.Observable.scanWith(Observable.java:11537) 在 io.reactivex.Observable.scan(Observable.java:11502) 在 com.name.app.features.monitoring.presentation.MonitoringViewModel.compose(MonitoringViewModel.kt:47) 在 com.name.app.features.monitoring.presentation.MonitoringViewModel.(MonitoringViewModel.kt:18) 在 com.name.app.features.monitoring.presentation.MonitoringViewModel_Factory.get(MonitoringViewModel_Factory.java:25) 在 com.name.app.features.monitoring.presentation.MonitoringViewModel_Factory.get(MonitoringViewModel_Factory.java:8) 在 dagger.internal.DoubleCheck.get(DoubleCheck.java:47) 在 com.name.app.di.viewmodel.ViewModelFactory.create(ViewModelFactory.kt:12) 在 androidx.lifecycle.ViewModelProvider.get(ViewModelProvider.java:164) 在 androidx.lifecycle.ViewModelProvider.get(ViewModelProvider.java:130) 在 com.name.app.features.monitoring.presentation.MonitoringActivity$viewModel$2.invoke(MonitoringActivity.kt:46) 在 com.name.app.features.monitoring.presentation.MonitoringActivity$viewModel$2.invoke(MonitoringActivity.kt:26) 在 kotlin.UnsafeLazyImpl.getValue(Lazy.kt:81) 在 com.name.app.features.monitoring.presentation.MonitoringActivity.getViewModel(未知 来源:7) 在 com.name.app.features.monitoring.presentation.MonitoringActivity.bind(MonitoringActivity.kt:85) 在 com.name.app.features.monitoring.presentation.MonitoringActivity.onCreate(MonitoringActivity.kt:119) 在 android.app.Activity.performCreate(Activity.java:6984) 在 android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1235) 在 android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2860) 在 android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2986) 在 android.app.ActivityThread.-wrap11(未知来源:0) 在 android.app.ActivityThread$H.handleMessage(ActivityThread.java:1641) 在 android.os.Handler.dispatchMessage(Handler.java:105) 在 android.os.Looper.loop(Looper.java:164) 在 android.app.ActivityThread.main(ActivityThread.java:6694) 在 java.lang.reflect.Method.invoke(本机方法) 在 com.android.internal.os.Zygote$MethodAndArgsCaller.run(Zygote.java:240) 在 com.android.internal.os.ZygoteInit.main(ZygoteInit.java:769)
class MonitoringViewModel @Inject constructor(
private val processor: MonitoringProcessor
) : BaseViewModel<MonitoringIntention, MonitoringViewState>() {
//Properties that are not relevant for the question
private val reducer: MonitoringStateReducer = MonitoringStateReducer()
private fun compose(): Observable<MonitoringViewState> {
return intentsSubject.compose(intentFilter)
.map(actionFromIntent)
.compose(processor)
.scan(MonitoringViewState.init(), reducer) //Exception is here
.distinctUntilChanged()
.replay(1)
.autoConnect(0)
}
override fun state(): Observable<MonitoringViewState> = compose()
//Functions that are not relevant for the question
}
此代码也不起作用。
private val reducer by lazy(LazyThreadSafetyMode.NONE) {
MonitoringStateReducer()
}
但是,如果我用这段代码替换减速器,它就可以工作。
private val reducer: BiFunction<MonitoringViewState, MonitoringResult, MonitoringViewState>
get() = MonitoringStateReducer()
在 Kotlin 1.3.40 和 1.3.50 上测试。
【问题讨论】:
-
检查堆栈跟踪,可能是
state()被调用并订阅了父构造函数的某个位置。 -
发布完整的
MonitoringStateReducer.apply方法。如果它太长,那么至少发布when块的几个分支。问题可能与那里的某些东西有关。
标签: java kotlin interface nullpointerexception rx-java2