Search code examples
javaexceptionclojurefunctional-programming

Clojure null pointer exception


I have the following code

(def lampo1 [-20 -18 -30 -5 7 15 25 18 7 0 -15 -10])
(def lampo2 [-21 -11 -31 -5 8 16 35 18 1 2 -15 -20])

(defn -main
  [& args]

  (let [keskiarvot (map #(/ (reduce + %) (count %)) (map vector lampo1 lampo2))] (
    (println keskiarvot)

    (let [positiiviset (filter pos? keskiarvot)](
      (println positiiviset)

      (let [posKeskiarvo (double (/ (reduce + positiiviset) (count positiiviset)))](
        (println posKeskiarvo))))))))

Which outputs the following

(-41/2 -29/2 -61/2 -5 15/2 31/2 30 18 4 1 -15 -15)
(15/2 31/2 30 18 4 1)
12.66666666666667
Exception in thread "main" java.lang.NullPointerException, compiling:(/tmp/form-init1433117969168569713.clj:1:73)
        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 v501.core$_main.invokeStatic(core.clj:16)
        at v501.core$_main.doInvoke(core.clj:7)
        at clojure.lang.RestFn.invoke(RestFn.java:397)
        at clojure.lang.Var.invoke(Var.java:375)
        at user$eval5.invokeStatic(form-init1433117969168569713.clj:1)
        at user$eval5.invoke(form-init1433117969168569713.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

So the code seems to run till end, but null pointer exception is thrown. What causes it? Also, what is wrong with the Clojure's stack trace? Seems like creator of the language was lazy and didn't implement exception abstraction at clojure level at all.


Solution

  • The problem is that you wrapped the body of let in extra parens, so effectively nil, the result of println is invoked as a function. Remove the parens and it works like expected:

    (defn -main
      [& args]
      (let [keskiarvot (map #(/ (reduce + %) (count %)) (map vector lampo1 lampo2))] 
        (println keskiarvot)
        (let [positiiviset (filter pos? keskiarvot)]
          (println positiiviset)
          (let [posKeskiarvo (double (/ (reduce + positiiviset) (count positiiviset)))]
            (println posKeskiarvo)))))