我已經編寫了以下代碼,用於查找pageCount位於特定內的漫畫預算。onError java.lang.NullPointerException:嘗試調用空對象引用上的虛擬方法'double java.lang.Double.doubleValue()'
起初,我試着拿出代碼,將有架構是這樣的:
- 流給人MarvelComic對象的價格。
- 我與以前的漫畫的價格是降下來此流求和MarvelComic對象的價格從流並檢查它是否是< 預算
- 如果是,那麼我總結了的頁頁次 MarvelComic對象與之前的pageCount之和MarvelComic對象下來的流。
- 如果是,則調用訂戶的onNext。
因爲我無法想出像上述步驟中提到的那樣編寫代碼的方法,所以我使用了無功編程的糖化命令編程。因此,我寫了下面的代碼:
Observable.fromIterable(getMarvelComicsList()).
map(new Function<MarvelComic, HashMap<String, Double>>() {
@Override
public HashMap<String, Double> apply(@NonNull MarvelComic marvelComic) throws Exception {
HashMap<String, Double> map = new HashMap<String, Double>();
map.put("price", Double.valueOf(marvelComic.getPrice()));
map.put("pageCount", Double.valueOf(marvelComic.getPageCount()));
map.put("comicCount", Double.valueOf(marvelComic.getPageCount()));
return map;
}
})
.scan(new HashMap<String, Double>(), new BiFunction<HashMap<String, Double>, HashMap<String, Double>, HashMap<String, Double>>() {
@Override
public HashMap<String, Double> apply(@NonNull HashMap<String, Double> inputMap, @NonNull HashMap<String, Double> newValueMap) throws Exception {
double sum = inputMap.get("price")+newValueMap.get("price");
double count = inputMap.get("pageCount")+newValueMap.get("pageCount");
double comicCount = inputMap.get("comicCount")+newValueMap.get("comicCount");
HashMap<String, Double> map = new HashMap<String, Double>();
map.put("price", sum);
map.put("pageCount", count);
map.put("comicCount", comicCount);
return map;
}
})
.takeWhile(new Predicate<HashMap<String, Double>>() {
@Override
public boolean test(@NonNull HashMap<String, Double> stringDoubleHashMap) throws Exception {
return stringDoubleHashMap.get("price") < budget;
}
})
.subscribe(new DisposableObserver<HashMap<String, Double>>() {
@Override
public void onNext(HashMap<String, Double> stringDoubleHashMap) {
double sum = stringDoubleHashMap.get("price");
double pageCount = stringDoubleHashMap.get("pageCount");
double comicCount = stringDoubleHashMap.get("comicCount");
Timber.e("sum %s pageCount %s ComicCount: %s", sum, pageCount, comicCount);
}
@Override
public void onError(Throwable e) {
Timber.e("onError %s", e.fillInStackTrace());
}
@Override
public void onComplete() {
Timber.e("onComplete");
}
});
我的酒店預訂:
- 它是創建一個新的Hashmap內
map(), scan()
每次都好主意嗎? - 如何進一步改進此代碼?
問題:
該代碼給出NullPointerException異常在onError
因爲map.get("price")
回報scan()
空。我不確定原因。
錯誤:
onError java.lang.NullPointerException: Attempt to invoke virtual method 'double java.lang.Double.doubleValue()' on a null object reference
注:
HashMap中不爲空,雙場被返回爲NULL出於某種原因。我試圖弄清楚如何。
爲什麼不使用具有'double'字段和兩個'int'字段而不是'HashMap'的類? –
是的,我想到了,但我認爲,而不是創建一個單獨的班級,訴諸收集將是一個更乾淨的解決方案。即使我創建了另一個班級,我也必須在精讀方法中創建該班級的一個對象。 –
@DharmbirSingh請發表問題並停止評論與此問題無關的內容。 –