导致此NullPointerException的原因是什么?

时间:2011-02-10 05:22:53

标签: clojure

我正在使用Project Euler问题来帮助我学习clojure,而且我遇到了一个我无法弄清楚的异常。 nillify和change-all在底部定义以供参考。

(loop [the-vector (vec (range 100))
       queue      (list 2 3 5 7)]
    (if queue
        (recur (nillify the-vector (first queue)) (next queue))
        the-vector))

这会引发NullPointerException,我无法弄清楚原因。代码的唯一部分我可以看到可以抛出这样的异常是对nillify的调用,但是在抛出异常之前,看起来队列似乎不会只归结为一个元素 - - 即使队列变空,这就是if语句的用途。

有什么想法吗?

“给定一个向量,一个值和一个索引列表,返回一个矢量w / everthing @ indice = value”

(defn change-all [the-vector indices val]
    (apply assoc the-vector (interleave indices (repeat (count indices) val))))

“给定一个向量和一个val,返回一个向量,其中索引等于val的倍数的所有条目都是nilled,但保留原始的”

(defn nillify [coll val]
    (change-all coll (range (* 2 val) (inc (last coll)) val) nil))

1 个答案:

答案 0 :(得分:5)

问题sexpr

(inc (last coll))

您正在更改矢量的内容,您不能再使用它来确定长度。代替:

(count coll)

作为一种风格问题,请使用let bindings:

(defn change-all [the-vector indices val]
  (let [c (count indices)
        s (interleave indices (repeat c val))]
    (apply assoc the-vector s)))

(defn nillify [coll val]
  (let [c (count coll)
        r (range (* 2 val) c val)]
    (change-all coll r nil)))

(loop [the-vector (vec (range 100))
       [f & r]    '(2 3 5 7)]
  (if r
     (recur (nillify the-vector f) r)
     the-vector))