2016-09-25 47 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.-你是对的。我很少需要这个(仅用于调试打印输出),我忘了它。 –