2011-02-10 6 views
4

저는 프로젝트 오일러 질문을 사용하여 클로져를 배울 수있게 도와 드리겠습니다. 알아낼 수없는 예외 상황이 발생했습니다. nillify 및 change-all은 참조 용으로 하단에 정의되어 있습니다.이 NullPointerException의 원인은 무엇입니까?

(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이 발생하며 그 이유를 알 수 없습니다. 내가 볼 수있는 코드의 유일한 부분은 과 같은 예외를 throw 할 수 있지만 nillify에 대한 호출이지만 예외가 throw되기 전에 큐가 한 요소 만 가져 오는 것처럼 보이지 않습니다. 빈 상태가되는 것이고, 그것은 if 문을위한 것입니다.

아이디어가 있으십니까?

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

"는 벡터 및 발 주어진"벡터, 값 및 인덱스들의리스트/모든게 @ indice = 값 승 벡터를 돌려 주어 "벡터를 반환하는 모든 인덱스 엔트리와 nilled되는 발의 배수와 동일하지만, "본래 그대로두고

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

당신이 NPE 스택 추적을 포함 할 수 있습니다 : 스타일의 문제로

(count coll) 

, 바인딩을하게 사용할 수 있습니까? –

+1

또한 첫 번째 줄 끝 부분에 누락 된 괄호가 하나 있다고 가정했지만 루프 본문은 여전히 ​​엉망진창처럼 보입니다. –

+1

루프의 두 번째 줄. 'queue (list (2 3 5 7))]'는'queue (list 2 3 5 7)]'이어야한다. 하지만 그것은 'ClassCastException'을 던지기 만하고'NullPointerException'은 던지지 않았습니다. – Jonas

답변

5

문제는 sexpr

(inc (last coll)) 
이다,536,

벡터의 내용이 변경되었으므로 길이를 더 이상 결정할 수 없습니다. 대신 :

(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)) 
+1

와우. 내가 그걸 몰랐다는 것을 믿을 수 없어. 엄청 고마워! 그리고 스타일 포인터를 주셔서 감사합니다. – invaliduser

관련 문제