Clojure:NullPointerException使用LazySeq

Clojure:NullPointerException使用LazySeq,clojure,nullpointerexception,lazy-sequences,Clojure,Nullpointerexception,Lazy Sequences,第一次尝试访问LazySeq时,我收到一个NullPointerException, 行项目-需要一些时间进行计算,然后在下一行计算总exc时,它会与NullPointerException中断: (defn orders->invoice [db billing-account-id dt orders resource-name] (let [line-items (mapcat (partial order->line-items db dt resource-name

第一次尝试访问LazySeq时,我收到一个NullPointerException, 行项目-需要一些时间进行计算,然后在下一行计算总exc时,它会与NullPointerException中断:

(defn orders->invoice [db billing-account-id dt orders resource-name]
    (let [line-items (mapcat (partial order->line-items db dt resource-name) orders) ;;lazy
          total-exc  (reduce + (map :invoice-item/total-exclusive line-items))       ;; NullPointerException
          total-inc  (reduce + (map :invoice-item/total-inclusive line-items))]

     {:invoice/items           line-items
      :invoice/total-exclusive total-exc
      :invoice/total-inclusive total-inc}))
没有数据丢失,就好像我在try-catch块中放置了一行,在try-catch块中单击它,然后在catch块中尝试相同的操作一样,它将起作用:

(try 
    (reduce + (map :invoice-item/total-exclusive line-items)) 
    (catch Exception e
      (clojure.pprint/pprint (.getStackTrace e))
      (reduce + (map :invoice-item/total-exclusive line-items))))
Stacktrace:

[[java.util.concurrent.FutureTask report "FutureTask.java" 122],
 [java.util.concurrent.FutureTask get "FutureTask.java" 192],
 [clojure.core$deref_future invokeStatic "core.clj" 2300],
 [clojure.core$future_call$reify__8439 deref "core.clj" 6974],
 [clojure.core$deref invokeStatic "core.clj" 2320],
 [clojure.core$deref invoke "core.clj" 2306],
 [clojure.core$map$fn__5851 invoke "core.clj" 2755],
 [clojure.lang.LazySeq sval "LazySeq.java" 42],
 [clojure.lang.LazySeq seq "LazySeq.java" 58],
 [clojure.lang.RT seq "RT.java" 531],
 [clojure.core$seq__5387 invokeStatic "core.clj" 137],
 [clojure.core$filter$fn__5878 invoke "core.clj" 2809],
 [clojure.lang.LazySeq sval "LazySeq.java" 42],
 [clojure.lang.LazySeq seq "LazySeq.java" 51],
 [clojure.lang.RT seq "RT.java" 531],
 [clojure.core$seq__5387 invokeStatic "core.clj" 137],
 [clojure.core$map$fn__5851 invoke "core.clj" 2746],
 [clojure.lang.LazySeq sval "LazySeq.java" 42],
 [clojure.lang.LazySeq seq "LazySeq.java" 51],
 [clojure.lang.RT seq "RT.java" 531],
 [clojure.core$seq__5387 invokeStatic "core.clj" 137],
 [clojure.core$concat$cat__5480$fn__5481 invoke "core.clj" 734],
 [clojure.lang.LazySeq sval "LazySeq.java" 42],
 [clojure.lang.LazySeq seq "LazySeq.java" 58],
 [clojure.lang.RT seq "RT.java" 531],
 [clojure.core$seq__5387 invokeStatic "core.clj" 137],
 [clojure.core$map$fn__5851 invoke "core.clj" 2746],
 [clojure.lang.LazySeq sval "LazySeq.java" 42],
 [clojure.lang.LazySeq seq "LazySeq.java" 51],
 [clojure.lang.Cons next "Cons.java" 39],
 [clojure.lang.RT next "RT.java" 709],
 [clojure.core$next__5371 invokeStatic "core.clj" 64],
 [clojure.core.protocols$fn__8144 invokeStatic "protocols.clj" 169],
 [clojure.core.protocols$fn__8144 invoke "protocols.clj" 124],
 [clojure.core.protocols$fn__8099$G__8094__8108 invoke "protocols.clj" 19],
 [clojure.core.protocols$seq_reduce invokeStatic "protocols.clj" 27],
 [clojure.core.protocols$fn__8131 invokeStatic "protocols.clj" 75],
 [clojure.core.protocols$fn__8131 invoke "protocols.clj" 75],
 [clojure.core.protocols$fn__8073$G__8068__8086 invoke "protocols.clj" 13],
 [clojure.core$reduce invokeStatic "core.clj" 6824],
 [clojure.core$reduce invoke "core.clj" 6810],
 [user$eval106182 invokeStatic "form-init3664079349963806059.clj" 15],
 [user$eval106182 invoke "form-init3664079349963806059.clj" 14],
 [clojure.lang.Compiler eval "Compiler.java" 7176],
 [clojure.lang.Compiler eval "Compiler.java" 7131],
 [clojure.core$eval invokeStatic "core.clj" 3214],
 [clojure.core$eval invoke "core.clj" 3210],
 [clojure.main$repl$read_eval_print__9068$fn__9071 invoke "main.clj" 414],
 [clojure.main$repl$read_eval_print__9068 invoke "main.clj" 414],
 [clojure.main$repl$fn__9077 invoke "main.clj" 435],
 [clojure.main$repl invokeStatic "main.clj" 435],
 [clojure.main$repl doInvoke "main.clj" 345],
 [clojure.lang.RestFn applyTo "RestFn.java" 137],
 [clojure.core$apply invokeStatic "core.clj" 665],
 [clojure.core$apply invoke "core.clj" 660],
 [refactor_nrepl.ns.slam.hound.regrow$wrap_clojure_repl$fn__62865 doInvoke "regrow.clj" 18],
 [clojure.lang.RestFn invoke "RestFn.java" 1523],
 [clojure.tools.nrepl.middleware.interruptible_eval$evaluate$fn__53116 invoke "interruptible_eval.clj" 87],
 [clojure.lang.AFn applyToHelper "AFn.java" 152],
 [clojure.lang.AFn applyTo "AFn.java" 144],
 [clojure.core$apply invokeStatic "core.clj" 665],
 [clojure.core$with_bindings_STAR_ invokeStatic "core.clj" 1973],
 [clojure.core$with_bindings_STAR_ doInvoke "core.clj" 1973],
 [clojure.lang.RestFn invoke "RestFn.java" 425],
 [clojure.tools.nrepl.middleware.interruptible_eval$evaluate invokeStatic "interruptible_eval.clj" 85],
 [clojure.tools.nrepl.middleware.interruptible_eval$evaluate invoke "interruptible_eval.clj" 55][clojure.tools.nrepl.middleware.interruptible_eval$interruptible_eval$fn__53161$fn__53164 invoke "interruptible_eval.clj" 222],
 [clojure.tools.nrepl.middleware.interruptible_eval$run_next$fn__53156 invoke "interruptible_eval.clj" 190],
 [clojure.lang.AFn run "AFn.java" 22],
 [java.util.concurrent.ThreadPoolExecutor runWorker "ThreadPoolExecutor.java" 1149],
 [java.util.concurrent.ThreadPoolExecutor$Worker run "ThreadPoolExecutor.java" 624],
 [java.lang.Thread run "Thread.java" 748]]
返回值:

[[java.util.concurrent.FutureTask report "FutureTask.java" 122],
 [java.util.concurrent.FutureTask get "FutureTask.java" 192],
 [clojure.core$deref_future invokeStatic "core.clj" 2300],
 [clojure.core$future_call$reify__8439 deref "core.clj" 6974],
 [clojure.core$deref invokeStatic "core.clj" 2320],
 [clojure.core$deref invoke "core.clj" 2306],
 [clojure.core$map$fn__5851 invoke "core.clj" 2755],
 [clojure.lang.LazySeq sval "LazySeq.java" 42],
 [clojure.lang.LazySeq seq "LazySeq.java" 58],
 [clojure.lang.RT seq "RT.java" 531],
 [clojure.core$seq__5387 invokeStatic "core.clj" 137],
 [clojure.core$filter$fn__5878 invoke "core.clj" 2809],
 [clojure.lang.LazySeq sval "LazySeq.java" 42],
 [clojure.lang.LazySeq seq "LazySeq.java" 51],
 [clojure.lang.RT seq "RT.java" 531],
 [clojure.core$seq__5387 invokeStatic "core.clj" 137],
 [clojure.core$map$fn__5851 invoke "core.clj" 2746],
 [clojure.lang.LazySeq sval "LazySeq.java" 42],
 [clojure.lang.LazySeq seq "LazySeq.java" 51],
 [clojure.lang.RT seq "RT.java" 531],
 [clojure.core$seq__5387 invokeStatic "core.clj" 137],
 [clojure.core$concat$cat__5480$fn__5481 invoke "core.clj" 734],
 [clojure.lang.LazySeq sval "LazySeq.java" 42],
 [clojure.lang.LazySeq seq "LazySeq.java" 58],
 [clojure.lang.RT seq "RT.java" 531],
 [clojure.core$seq__5387 invokeStatic "core.clj" 137],
 [clojure.core$map$fn__5851 invoke "core.clj" 2746],
 [clojure.lang.LazySeq sval "LazySeq.java" 42],
 [clojure.lang.LazySeq seq "LazySeq.java" 51],
 [clojure.lang.Cons next "Cons.java" 39],
 [clojure.lang.RT next "RT.java" 709],
 [clojure.core$next__5371 invokeStatic "core.clj" 64],
 [clojure.core.protocols$fn__8144 invokeStatic "protocols.clj" 169],
 [clojure.core.protocols$fn__8144 invoke "protocols.clj" 124],
 [clojure.core.protocols$fn__8099$G__8094__8108 invoke "protocols.clj" 19],
 [clojure.core.protocols$seq_reduce invokeStatic "protocols.clj" 27],
 [clojure.core.protocols$fn__8131 invokeStatic "protocols.clj" 75],
 [clojure.core.protocols$fn__8131 invoke "protocols.clj" 75],
 [clojure.core.protocols$fn__8073$G__8068__8086 invoke "protocols.clj" 13],
 [clojure.core$reduce invokeStatic "core.clj" 6824],
 [clojure.core$reduce invoke "core.clj" 6810],
 [user$eval106182 invokeStatic "form-init3664079349963806059.clj" 15],
 [user$eval106182 invoke "form-init3664079349963806059.clj" 14],
 [clojure.lang.Compiler eval "Compiler.java" 7176],
 [clojure.lang.Compiler eval "Compiler.java" 7131],
 [clojure.core$eval invokeStatic "core.clj" 3214],
 [clojure.core$eval invoke "core.clj" 3210],
 [clojure.main$repl$read_eval_print__9068$fn__9071 invoke "main.clj" 414],
 [clojure.main$repl$read_eval_print__9068 invoke "main.clj" 414],
 [clojure.main$repl$fn__9077 invoke "main.clj" 435],
 [clojure.main$repl invokeStatic "main.clj" 435],
 [clojure.main$repl doInvoke "main.clj" 345],
 [clojure.lang.RestFn applyTo "RestFn.java" 137],
 [clojure.core$apply invokeStatic "core.clj" 665],
 [clojure.core$apply invoke "core.clj" 660],
 [refactor_nrepl.ns.slam.hound.regrow$wrap_clojure_repl$fn__62865 doInvoke "regrow.clj" 18],
 [clojure.lang.RestFn invoke "RestFn.java" 1523],
 [clojure.tools.nrepl.middleware.interruptible_eval$evaluate$fn__53116 invoke "interruptible_eval.clj" 87],
 [clojure.lang.AFn applyToHelper "AFn.java" 152],
 [clojure.lang.AFn applyTo "AFn.java" 144],
 [clojure.core$apply invokeStatic "core.clj" 665],
 [clojure.core$with_bindings_STAR_ invokeStatic "core.clj" 1973],
 [clojure.core$with_bindings_STAR_ doInvoke "core.clj" 1973],
 [clojure.lang.RestFn invoke "RestFn.java" 425],
 [clojure.tools.nrepl.middleware.interruptible_eval$evaluate invokeStatic "interruptible_eval.clj" 85],
 [clojure.tools.nrepl.middleware.interruptible_eval$evaluate invoke "interruptible_eval.clj" 55][clojure.tools.nrepl.middleware.interruptible_eval$interruptible_eval$fn__53161$fn__53164 invoke "interruptible_eval.clj" 222],
 [clojure.tools.nrepl.middleware.interruptible_eval$run_next$fn__53156 invoke "interruptible_eval.clj" 190],
 [clojure.lang.AFn run "AFn.java" 22],
 [java.util.concurrent.ThreadPoolExecutor runWorker "ThreadPoolExecutor.java" 1149],
 [java.util.concurrent.ThreadPoolExecutor$Worker run "ThreadPoolExecutor.java" 624],
 [java.lang.Thread run "Thread.java" 748]]
176805

这项技术已经运行了多年,唯一的区别是需要处理的数据要多得多,或者需要更长的时间

我试着用doall来认识懒汉——同样的事情,但只是第一次


我以前从未见过这样的行为,因此非常感谢您的帮助

您的
行项目
中有一个异常,在您尝试实现求和之前,它不会出现。您将从如下值中看到相同的行为:

user=> (def xs (take 10 (map #(/ 2 %) (iterate dec 3))))
#'user/xs
user=> (apply + xs)
Execution error (ArithmeticException) at user/fn (REPL:1).
Divide by zero
user=> (apply + xs)
11/3 ;; (which is 2/3 + 2/2 + 2/1)
第二次尝试得到有效结果并不意味着您的输入是有效的。异常导致
xs
丢弃最后一个有效项之后的所有内容


因此,与其在您发布的代码中查找bug,不如找出您最终如何生成无效的
行项目

未来
从何而来?另外,用
(vec…
订单
行项目
周围消除所有的懒惰。这就是我在stacktrace中试图弄明白的,尝试过的vec。。。同样的事情。这件事已经拖了两天了。