2016-09-25 76 views
1

我不斷收到下面的代碼的NullPointerException,我試過並試圖追蹤它,但無濟於事。我試圖打印出它打印出來的拼貼猜想的每個數字,然後給我一個空指針異常錯誤,我找不到它。 在此先感謝!Clojure Collat​​z猜想NullPointerException

 1 (ns collatz.core 
     2 (:gen-class)) 
     3 
     4 
     5 (defn collatz [n] 
     6 (
     7 (println n) 
     8  (if (= n 1) 
     9  (println "done") 
     10  (if (odd? n) 
     11  (collatz 
     12   (+(* n 3) 1)) 
     13  (collatz (/ n 2)))))) 

    14 (defn -main [] (collatz 48)) 



Exception in thread "main" java.lang.NullPointerException, compiling:(/private/var/folders/yh/80f0k44s19lgzck9bgpq746w0000gn/T/form-init1027767069879550093.clj:1:125) 
    at clojure.lang.Compiler.load(Compiler.java:7391) 
    at clojure.lang.Compiler.loadFile(Compiler.java:7317) 
    at clojure.main$load_script.invokeStatic(main.clj:275) 
    at clojure.main$init_opt.invokeStatic(main.clj:277) 
    at clojure.main$init_opt.invoke(main.clj:277) 
    at clojure.main$initialize.invokeStatic(main.clj:308) 
    at clojure.main$null_opt.invokeStatic(main.clj:342) 
    at clojure.main$null_opt.invoke(main.clj:339) 
    at clojure.main$main.invokeStatic(main.clj:421) 
    at clojure.main$main.doInvoke(main.clj:384) 
    at clojure.lang.RestFn.invoke(RestFn.java:421) 
    at clojure.lang.Var.invoke(Var.java:383) 
    at clojure.lang.AFn.applyToHelper(AFn.java:156) 
    at clojure.lang.Var.applyTo(Var.java:700) 
    at clojure.main.main(main.java:37) 
Caused by: java.lang.NullPointerException 
    at collatz.core$collatz.invokeStatic(core.clj:6) 
    at collatz.core$collatz.invoke(core.clj:5) 
    at collatz.core$collatz.invokeStatic(core.clj:13) 
    at collatz.core$collatz.invoke(core.clj:5) 
    at collatz.core$collatz.invokeStatic(core.clj:13) 
    at collatz.core$collatz.invoke(core.clj:5) 
    at collatz.core$collatz.invokeStatic(core.clj:13) 
    at collatz.core$collatz.invoke(core.clj:5) 
    at collatz.core$collatz.invokeStatic(core.clj:13) 
    at collatz.core$collatz.invoke(core.clj:5) 
    at collatz.core$collatz.invokeStatic(core.clj:11) 
    at collatz.core$collatz.invoke(core.clj:5) 
    at collatz.core$collatz.invokeStatic(core.clj:13) 
    at collatz.core$collatz.invoke(core.clj:5) 
    at collatz.core$collatz.invokeStatic(core.clj:11) 
    at collatz.core$collatz.invoke(core.clj:5) 
    at collatz.core$collatz.invokeStatic(core.clj:13) 
    at collatz.core$collatz.invoke(core.clj:5) 
    at collatz.core$collatz.invokeStatic(core.clj:13) 
    at collatz.core$collatz.invoke(core.clj:5) 
    at collatz.core$collatz.invokeStatic(core.clj:13) 
    at collatz.core$collatz.invoke(core.clj:5) 
    at collatz.core$collatz.invokeStatic(core.clj:13) 
    at collatz.core$collatz.invoke(core.clj:5) 
    at collatz.core$_main.invokeStatic(core.clj:14) 
    at collatz.core$_main.invoke(core.clj:14) 
    at clojure.lang.Var.invoke(Var.java:375) 
    at user$eval5.invokeStatic(form-init1027767069879550093.clj:1) 
    at user$eval5.invoke(form-init1027767069879550093.clj:1) 
    at clojure.lang.Compiler.eval(Compiler.java:6927) 
    at clojure.lang.Compiler.eval(Compiler.java:6917) 
    at clojure.lang.Compiler.load(Compiler.java:7379) 
    ... 14 more 

回答

2

你必須在頭位(7號線),這意味着你試圖調用由(println n)返回的函數值(println n)println總是返回nil,所以你得到NullPointerException

的最小變化是使用do塊:

(defn collatz [n] 
    (do 
    (println n) 
    (if (= n 1) 
     (println "done") 
     (if (odd? n) 
     (collatz 
      (+ (* n 3) 1)) 
     (collatz (/ n 2)))))) 

雖然坦言看起來不自然Clojure中。編碼這種更習慣的方式是產生一個序列,而不是將元素打印出來。

此外,我強烈懷疑你沒有必要在gen-class。如果你只需要運行你的函數,使用REPL。

編輯:正如在評論中指出,真正的最小變化是去掉多餘的括號,因爲defn(和fn)包括隱含do

(def collatz [n] 
    (println n) 
    (if (= n 1) 
    (println "done") 
    (if (odd? n) 
     (collatz 
     (+ (* n 3) 1)) 
     (collatz (/ n 2))))) 
+3

最小的變化將是去除錯誤因爲'defn'有一個隱含的'do'。 –

+0

@ TerjeD.-你是對的。我很少需要這個(僅用於調試打印輸出),我忘了它。 –