Observable.just("123")
.map(new Function<String, Integer>() {
@Override
public Integer apply(String s) throws Exception {
String i = null;
i.length();
return 1;
}
}).subscribe();
這種情況下, 由于在subscribe時沒有傳入異常處理時的Consumer, 所以在這里會崩掉.
看一下源碼:
public final Disposable subscribe() {
// 會傳入一個默認(rèn)的 Functions.ERROR_CONSUMER
return subscribe(Functions.emptyConsumer()
, Functions.ERROR_CONSUMER
, Functions.EMPTY_ACTION, Functions.emptyConsumer());
}
public static final Consumer<Throwable> ERROR_CONSUMER = new Consumer<Throwable>() {
@Override
public void accept(Throwable error) {
// 捕獲到異常后會掉還用 RxJavaPlugins.onError.onError();
RxJavaPlugins.onError(error);
}
};
public static void onError(Throwable error) {
// 注意errorHandler
Consumer<Throwable> f = errorHandler;
if (error == null) {
error = new NullPointerException("onError called with null. Null values are generally not allowed in 2.x operators and sources.");
}
// errorHandler不為空, 調(diào)用它的 accept() 方法, 并 return
if (f != null) {
try {
f.accept(error);
return;
} catch (Throwable e) {
e.printStackTrace(); // NOPMD
uncaught(e);
}
}
// 如果執(zhí)行到這里就會拋出異常
error.printStackTrace(); // NOPMD
uncaught(error);
}
// RxjavaPlugins
static volatile Consumer<Throwable> errorHandler;
public static void setErrorHandler(Consumer<Throwable> handler) {
if (lockdown) {
throw new IllegalStateException("Plugins can't be changed anymore");
}
errorHandler = handler;
}
可以利用 上面的方法設(shè)置errorHandler, 這樣當(dāng)你, subscribr()不傳入errorConsumer時, 就會捕獲到異常不會崩掉