Clojure函数抛出空指针异常

时间:2013-08-13 12:56:41

标签: list vector clojure nullpointerexception arity

我刚刚开始自学clojure,我很开心。然而,当我开始执行我写的这个功能时,麻烦就开始了!

这是一个简单的函数,可以接受多个参数&返回最后一个和第一个参数之间的差异。

(defn diff-last-first 
   "gets the difference between the last & the first arguments" 
   [& args] 
   (- (get args (- (count args) 1)) (get args 0)))

我知道我可以简单地使用 last 函数来获取args的最后一个元素,但是我无法理解为什么这会抛出 NullPointerException 我执行 (diff-last-first 1 2 3)

3 个答案:

答案 0 :(得分:3)

如果您确实想要访问列表的第n个值,可以使用nth

(defn diff-last-first [& args]
   (- (nth args (dec (count args)))
      (nth args 0)))

但是,正如您在问题中指出的那样,使用firstlast更加惯用:

(defn diff-last-first [& args]
  (- (last args) 
     (first args)))

答案 1 :(得分:2)

(get (list :foo) 0)评估为零。

列表不应该被索引访问:在Clojure中,这是一个常见的设计决策,可以防止这种低效率。

答案 2 :(得分:0)

好的,明白了!

@vemv是对的! [&安培; args]是一个列表,因此(get args 0)返回 nil

(defn get-l-f [args] (- (get args (- (count args) 1)) (get args 0)))按预期工作,而 args 是这里的向量!