Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/clojure/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/django/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Web applications compojure web项目中的堆栈溢出异常_Web Applications_Clojure_Compojure - Fatal编程技术网

Web applications compojure web项目中的堆栈溢出异常

Web applications compojure web项目中的堆栈溢出异常,web-applications,clojure,compojure,Web Applications,Clojure,Compojure,我一直在玩clojure,并用它来构建一个简单的小音频播放器。奇怪的是,有时,可能是二十分之一,在联系服务器时,我会出现以下错误: 2010-04-20 15:33:20.963::WARN: Error for /control java.lang.StackOverflowError at clojure.lang.RT.seq(RT.java:440) at clojure.core$seq__4245.invoke(core.clj:105) at clojur

我一直在玩clojure,并用它来构建一个简单的小音频播放器。奇怪的是,有时,可能是二十分之一,在联系服务器时,我会出现以下错误:

2010-04-20 15:33:20.963::WARN:  Error for /control
java.lang.StackOverflowError
    at clojure.lang.RT.seq(RT.java:440)
    at clojure.core$seq__4245.invoke(core.clj:105)
    at clojure.core$filter__5084$fn__5086.invoke(core.clj:1794)
    at clojure.lang.LazySeq.sval(LazySeq.java:42)
    at clojure.lang.LazySeq.seq(LazySeq.java:56)
    at clojure.lang.RT.seq(RT.java:440)
    at clojure.core$seq__4245.invoke(core.clj:105)
    at clojure.core$filter__5084$fn__5086.invoke(core.clj:1794)
    at clojure.lang.LazySeq.sval(LazySeq.java:42)
    at clojure.lang.LazySeq.seq(LazySeq.java:56)
    at clojure.lang.RT.seq(RT.java:440)
    at clojure.core$seq__4245.invoke(core.clj:105)
    at clojure.core$filter__5084$fn__5086.invoke(core.clj:1794)
    at clojure.lang.LazySeq.sval(LazySeq.java:42)
    at clojure.lang.LazySeq.seq(LazySeq.java:56)
    at clojure.lang.RT.seq(RT.java:440)
    at clojure.core$seq__4245.invoke(core.clj:105)
    at clojure.core$filter__5084$fn__5086.invoke(core.clj:1794)
    at clojure.lang.LazySeq.sval(LazySeq.java:42)
    at clojure.lang.LazySeq.seq(LazySeq.java:56)
    at clojure.lang.RT.seq(RT.java:440)
        ...
如果我再做一次,它总是有效的。所以它似乎与时间或其他有关。有关守则是:

(defn add-track [t]
  (common/ref-add tracks t))

(defn add-collection [coll]
  (doseq [track coll] (add-track track)))

其中,coll从该函数中提取:

(defn tracks-by-album [album]
  (sort sort-tracks (filter #(= (:album %) album) @tracks)))
它使用:

(defn get-album-from-track [track]
  (seq/find-first #(= (:album track) (:name %)) @albums))

(defn sort-tracks [track1 track2]
  (cond (= (:album track1) (:album track2))
    (cond (and (:album-track track1) (:album-track track2))
      (< (:album-track track1) (:album-track track2))
      :else 0)
    :else
     (> (:year (get-album-from-track track1)) (:year (get-album-from-track track2)))))
我从来没有在我的日志中得到处理命令,所以它在按唱片集播放曲目时必须停止

因此,它看起来确实是堆栈跟踪中的“按唱片集播放曲目”功能。我只是不明白为什么有时有效有时无效。我说它是按唱片集播放的曲目,因为它是唯一一个进行过滤的功能(包括它的子项),从跟踪中可以看出


所有源代码可在以下位置获得:。学习clojure是我的一个小爱好项目,到目前为止,它有很多缺陷(这只是一个缺陷:),所以我还不想告诉太多人:)

我在clojure邮件列表上问了这个问题。答案似乎是过滤器返回一个懒惰的seq,当您链接这些seq时,您将在某个点以堆栈溢出结束。您可以使用doall强制生成序列。

您可以说“(…)因此它看起来确实是stack trace中的tracks by album函数”,但该函数在您发布的stack trace(堆栈跟踪的一部分)中不起作用。是否有更多的错误输出?另外,你能给我们看一下排序的曲目和任何地方的曲目专辑得到调用?(或者,如果有太多的内容无法全部发布,你可以选择那些看起来最相关的内容。)我用更多的代码更新了这篇文章。此外,堆栈跟踪就像我发布的代码片段一样继续。遗憾的是,没有更多有趣的信息;-)我还想补充一点,tracks是对大约2300个元素(包含名称、文件名等内容的结构)列表的引用。我花了一段时间才理解“堆栈溢出”不是对该站点的引用;)
(defn get-album-from-track [track]
  (seq/find-first #(= (:album track) (:name %)) @albums))

(defn sort-tracks [track1 track2]
  (cond (= (:album track1) (:album track2))
    (cond (and (:album-track track1) (:album-track track2))
      (< (:album-track track1) (:album-track track2))
      :else 0)
    :else
     (> (:year (get-album-from-track track1)) (:year (get-album-from-track track2)))))
(when-handle-command cmd params (audio/tracks-by-album decoded-name))

(defn when-handle-command [cmd params data]
  (println (str "handling command:" cmd))
    ....)