2017-02-28 35 views
0

在我看来,RxJava不会给出良好的异常跟踪。RxJava 2不会告诉错误行

一个例子是我在运行单元测试时从Eclipse获得的。不清楚使用map函数的哪个代码。

有什么特别的技巧来增加追踪能力吗?或者这被认为是一个错误?

2017-02-28 19:12:44/SGT INFO c.bt.nmdb.ndac.adapter.Bnmpv5Adapter  : Current time stamp - Tue Dec 23 23:56:00 SGT 2014 
2017-02-28 19:12:45/SGT TRACE c.bt.nmdb.ndac.adapter.Bnmpv5Adapter  : @findAndSendDeviceCredentials() 
io.reactivex.exceptions.OnErrorNotImplementedException: The mapper function returned a null value. 
    at io.reactivex.internal.functions.Functions$14.accept(Functions.java:229) 
    at io.reactivex.internal.functions.Functions$14.accept(Functions.java:226) 
    at io.reactivex.internal.subscribers.LambdaSubscriber.onError(LambdaSubscriber.java:75) 
    at io.reactivex.internal.operators.flowable.FlowableDoOnEach$DoOnEachSubscriber.onError(FlowableDoOnEach.java:109) 
    at io.reactivex.internal.subscribers.BasicFuseableSubscriber.onError(BasicFuseableSubscriber.java:100) 
    at io.reactivex.internal.subscribers.BasicFuseableSubscriber.fail(BasicFuseableSubscriber.java:110) 
    at io.reactivex.internal.operators.flowable.FlowableMap$MapSubscriber.onNext(FlowableMap.java:65) 
    at io.reactivex.internal.operators.flowable.FlowableFromArray$ArraySubscription.fastPath(FlowableFromArray.java:134) 
    at io.reactivex.internal.operators.flowable.FlowableFromArray$BaseArraySubscription.request(FlowableFromArray.java:87) 
    at io.reactivex.internal.subscribers.BasicFuseableSubscriber.request(BasicFuseableSubscriber.java:152) 
    at io.reactivex.internal.subscribers.BasicFuseableSubscriber.request(BasicFuseableSubscriber.java:152) 
    at io.reactivex.internal.subscribers.LambdaSubscriber.request(LambdaSubscriber.java:110) 
    at io.reactivex.internal.operators.flowable.FlowableInternalHelper$RequestMax.accept(FlowableInternalHelper.java:244) 
    at io.reactivex.internal.operators.flowable.FlowableInternalHelper$RequestMax.accept(FlowableInternalHelper.java:240) 
    at io.reactivex.internal.subscribers.LambdaSubscriber.onSubscribe(LambdaSubscriber.java:48) 
    at io.reactivex.internal.subscribers.BasicFuseableSubscriber.onSubscribe(BasicFuseableSubscriber.java:66) 
    at io.reactivex.internal.subscribers.BasicFuseableSubscriber.onSubscribe(BasicFuseableSubscriber.java:66) 
    at io.reactivex.internal.operators.flowable.FlowableFromArray.subscribeActual(FlowableFromArray.java:37) 
    at io.reactivex.Flowable.subscribe(Flowable.java:12901) 
    at io.reactivex.internal.operators.flowable.FlowableMap.subscribeActual(FlowableMap.java:37) 
    at io.reactivex.Flowable.subscribe(Flowable.java:12901) 
    at io.reactivex.internal.operators.flowable.FlowableDoOnEach.subscribeActual(FlowableDoOnEach.java:48) 
    at io.reactivex.Flowable.subscribe(Flowable.java:12901) 
    at io.reactivex.Flowable.subscribe(Flowable.java:12886) 
    at io.reactivex.Flowable.subscribe(Flowable.java:12746) 
    at michsan.adapter.Bnmpv5Adapter_On_FindAndSendDeviceCredentials_TestCase.shouldFindDeviceCredentialsAndBuildResponses(Bnmpv5Adapter_On_FindAndSendDeviceCredentials_TestCase.java:71) 
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
    at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source) 
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source) 
    at java.lang.reflect.Method.invoke(Unknown Source) 
    at org.junit.runners.model.FrameworkMethod$1.runReflectiveCall(FrameworkMethod.java:50) 
    at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:12) 
    at org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:47) 
    at org.junit.internal.runners.statements.InvokeMethod.evaluate(InvokeMethod.java:17) 
    at org.junit.internal.runners.statements.RunBefores.evaluate(RunBefores.java:26) 
    at org.junit.runners.ParentRunner.runLeaf(ParentRunner.java:325) 
    at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:78) 
    at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:57) 
    at org.junit.runners.ParentRunner$3.run(ParentRunner.java:290) 
    at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:71) 
    at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:288) 
    at org.junit.runners.ParentRunner.access$000(ParentRunner.java:58) 
    at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:268) 
    at org.junit.runners.ParentRunner.run(ParentRunner.java:363) 
    at org.eclipse.jdt.internal.junit4.runner.JUnit4TestReference.run(JUnit4TestReference.java:86) 
    at org.eclipse.jdt.internal.junit.runner.TestExecution.run(TestExecution.java:38) 
    at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:459) 
    at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:675) 
    at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run(RemoteTestRunner.java:382) 
    at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main(RemoteTestRunner.java:192) 
Caused by: java.lang.NullPointerException: The mapper function returned a null value. 
    at io.reactivex.internal.functions.ObjectHelper.requireNonNull(ObjectHelper.java:39) 
    at io.reactivex.internal.operators.flowable.FlowableMap$MapSubscriber.onNext(FlowableMap.java:63) 
    ... 43 more 
Exception in thread "main" io.reactivex.exceptions.OnErrorNotImplementedException: The mapper function returned a null value. 
    at io.reactivex.internal.functions.Functions$14.accept(Functions.java:229) 
    at io.reactivex.internal.functions.Functions$14.accept(Functions.java:226) 
    at io.reactivex.internal.subscribers.LambdaSubscriber.onError(LambdaSubscriber.java:75) 
    at io.reactivex.internal.operators.flowable.FlowableDoOnEach$DoOnEachSubscriber.onError(FlowableDoOnEach.java:109) 
    at io.reactivex.internal.subscribers.BasicFuseableSubscriber.onError(BasicFuseableSubscriber.java:100) 
    at io.reactivex.internal.subscribers.BasicFuseableSubscriber.fail(BasicFuseableSubscriber.java:110) 
    at io.reactivex.internal.operators.flowable.FlowableMap$MapSubscriber.onNext(FlowableMap.java:65) 
    at io.reactivex.internal.operators.flowable.FlowableFromArray$ArraySubscription.fastPath(FlowableFromArray.java:134) 
    at io.reactivex.internal.operators.flowable.FlowableFromArray$BaseArraySubscription.request(FlowableFromArray.java:87) 
    at io.reactivex.internal.subscribers.BasicFuseableSubscriber.request(BasicFuseableSubscriber.java:152) 
    at io.reactivex.internal.subscribers.BasicFuseableSubscriber.request(BasicFuseableSubscriber.java:152) 
    at io.reactivex.internal.subscribers.LambdaSubscriber.request(LambdaSubscriber.java:110) 
    at io.reactivex.internal.operators.flowable.FlowableInternalHelper$RequestMax.accept(FlowableInternalHelper.java:244) 
    at io.reactivex.internal.operators.flowable.FlowableInternalHelper$RequestMax.accept(FlowableInternalHelper.java:240) 
    at io.reactivex.internal.subscribers.LambdaSubscriber.onSubscribe(LambdaSubscriber.java:48) 
    at io.reactivex.internal.subscribers.BasicFuseableSubscriber.onSubscribe(BasicFuseableSubscriber.java:66) 
    at io.reactivex.internal.subscribers.BasicFuseableSubscriber.onSubscribe(BasicFuseableSubscriber.java:66) 
    at io.reactivex.internal.operators.flowable.FlowableFromArray.subscribeActual(FlowableFromArray.java:37) 
    at io.reactivex.Flowable.subscribe(Flowable.java:12901) 
    at io.reactivex.internal.operators.flowable.FlowableMap.subscribeActual(FlowableMap.java:37) 
    at io.reactivex.Flowable.subscribe(Flowable.java:12901) 
    at io.reactivex.internal.operators.flowable.FlowableDoOnEach.subscribeActual(FlowableDoOnEach.java:48) 
    at io.reactivex.Flowable.subscribe(Flowable.java:12901) 
    at io.reactivex.Flowable.subscribe(Flowable.java:12886) 
    at io.reactivex.Flowable.subscribe(Flowable.java:12746) 
    at michsan.adapter.Bnmpv5Adapter_On_FindAndSendDeviceCredentials_TestCase.shouldFindDeviceCredentialsAndBuildResponses(Bnmpv5Adapter_On_FindAndSendDeviceCredentials_TestCase.java:71) 
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
    at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source) 
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source) 
    at java.lang.reflect.Method.invoke(Unknown Source) 
    at org.junit.runners.model.FrameworkMethod$1.runReflectiveCall(FrameworkMethod.java:50) 
    at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:12) 
    at org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:47) 
    at org.junit.internal.runners.statements.InvokeMethod.evaluate(InvokeMethod.java:17) 
    at org.junit.internal.runners.statements.RunBefores.evaluate(RunBefores.java:26) 
    at org.junit.runners.ParentRunner.runLeaf(ParentRunner.java:325) 
    at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:78) 
    at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:57) 
    at org.junit.runners.ParentRunner$3.run(ParentRunner.java:290) 
    at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:71) 
    at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:288) 
    at org.junit.runners.ParentRunner.access$000(ParentRunner.java:58) 
    at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:268) 
    at org.junit.runners.ParentRunner.run(ParentRunner.java:363) 
    at org.eclipse.jdt.internal.junit4.runner.JUnit4TestReference.run(JUnit4TestReference.java:86) 
    at org.eclipse.jdt.internal.junit.runner.TestExecution.run(TestExecution.java:38) 
    at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:459) 
    at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:675) 
    at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run(RemoteTestRunner.java:382) 
    at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main(RemoteTestRunner.java:192) 
Caused by: java.lang.NullPointerException: The mapper function returned a null value. 
    at io.reactivex.internal.functions.ObjectHelper.requireNonNull(ObjectHelper.java:39) 
    at io.reactivex.internal.operators.flowable.FlowableMap$MapSubscriber.onNext(FlowableMap.java:63) 
    ... 43 more 
+0

michsan.adapter.Bnmpv5Adapter_On_FindAndSendDeviceCredentials_TestCase.shouldFindDeviceCredentialsAndBuildResponses(Bnmpv5Adapter_On_FindAndSendDeviceCredentials_TestCase.java:71)。你有一个fromArray()后跟一个map()。我们无法为您提供帮助,因为没有可靠的方法来找到拉姆达的位置:大部分时间里,您从他们身上获得的数据都是一个神秘的数字。另一种方法是从RxJava2Extensions进行程序集跟踪,这可能会告诉你在哪里创建了map(),该主机是lambda。 – akarnokd

回答

1

上akarnokd的答案构建,要使用RxJavaPlugins添加一个钩子每个可流动的,可观察......举例来说,如akarnokd在他RxJava2Extensions库可流动的作用:

RxJavaPlugins.setOnFlowableAssembly(new Function<Flowable, Flowable>() { 
    @Override 
    public Flowable apply(Flowable f) throws Exception { 
     // Play with the Stack, collect info 
     return new FlowableOnAssembly(f); 
    } 
}); 

这样,您可以收集该信息(例如堆栈)FlowableOnAssembly。此时,如果您可以捕捉崩溃,则可以访问您添加的信息(堆栈跟踪,以及您投入FlowableOnAssembly的任何其他信息)。

为了便于调试,即使在偏远的设备,你可以设置一个DefaultUncaughtExceptionHandler捕捉到任何崩溃并打印你所收集的信息在FlowableOnAssembly,例如:

Thread.setDefaultUncaughtExceptionHandler(new Thread.UncaughtExceptionHandler() { 
    @Override 
    public void uncaughtException(Thread t, Throwable e) { 
     if (e instanceOf FlowableOnAssembly) { 
      // Print the info you captured 
     } 
    } 
}; 

该机制将成为拦截一切RxJava2呢,所以你可能想要很容易地放入/删除启用/禁用它。你可以去使用一个小型图书馆,我在为此写道:

RxJava2Debug

RxJava2Debug将创造一个不错的简单堆栈跟踪你。或者,它也会对其进行过滤,以便根本原因的第一项指向您的代码(这样Crashlytics等服务可以为您整理不同的错误)。

+0

尽管这个链接可能回答这个问题,但最好在这里包含答案的重要部分,并提供供参考的链接。如果链接页面更改,则仅链接答案可能会失效。 - [来自评论](/ review/low-quality-posts/16597343) – jwenting

+0

我明白了。我添加了关于要遵循的模式的解释。感谢指针! –

相关问题