2017-02-28 33 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

我明白了。我添加了關於要遵循的模式的解釋。感謝指針! –

相關問題