2016-09-25 6 views
1

次のコードでNullPointerExceptionが発生し続けていますが、私は試してみましたが、それをトレースしようとしましたが役に立たなくなりました。私はそれが印刷されるcollat​​zの推測の各番号を印刷しようとしているし、私にnullポインタの例外エラーを与えると私はそれを見つけることができません。 ありがとうございます!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

あなたは(println n)で返される関数値を呼び出そうと意味ヘッド位置(ライン7)、で(println n)を持っています。 printlnは常にnilを返しますので、NullPointerExceptionとなります。率直に言って、それはClojureの中に不自然に見えますが

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

最小限の変更はdoブロックを使用することです。これをコード化するもっと慣用的な方法は、要素を出力する代わりにシーケンスを生成することです。

また、私は強くあなたが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.-そうです。私はそれを忘れてしまったので、これはほとんど必要ありません(印刷物のデバッグのみ)。 –

関連する問題