2014-06-11 27 views
3

我在我的Clojure得到这个怪异的NPE的Hello WorldClojure的NPE在主

(ns test-app.core 
    (:gen-class)) 

(defn -main [& args] 
    ((println "Hello"))) 

注意额外的()周围(的println “你好”)。这似乎是问题,如果我删除它就好了。

和程序的输出。注意代码实际上打印了“Hello”和投掷。

Hello 
Exception in thread "main" java.lang.NullPointerException 
    at test_app.core$_main.doInvoke(core.clj:5) 
    at clojure.lang.RestFn.invoke(RestFn.java:397) 
    at clojure.lang.Var.invoke(Var.java:411) 
    at user$eval5$fn__7.invoke(form-init9064825970813284041.clj:1) 
    at user$eval5.invoke(form-init9064825970813284041.clj:1) 
    at clojure.lang.Compiler.eval(Compiler.java:6619) 
    at clojure.lang.Compiler.eval(Compiler.java:6609) 
    at clojure.lang.Compiler.load(Compiler.java:7064) 
    at clojure.lang.Compiler.loadFile(Compiler.java:7020) 
    at clojure.main$load_script.invoke(main.clj:294) 
    at clojure.main$init_opt.invoke(main.clj:299) 
    at clojure.main$initialize.invoke(main.clj:327) 
    at clojure.main$null_opt.invoke(main.clj:362) 
    at clojure.main$main.doInvoke(main.clj:440) 
    at clojure.lang.RestFn.invoke(RestFn.java:421) 
    at clojure.lang.Var.invoke(Var.java:419) 
    at clojure.lang.AFn.applyToHelper(AFn.java:163) 
    at clojure.lang.Var.applyTo(Var.java:532) 
    at clojure.main.main(main.java:37) 
[Finished in 4.0s with exit code 1] 

我的问题是为什么会发生这种情况?

或更好:那么这是一个错误还是预期的行为?

我认为这是因为列表的第一个参数应该是一个函数的名称,在这里是另一个列表:P。但是在这种情况下编译器/运行时不应该给出更好的错误?

Thx提前。

回答

5

我认为这是因为列表的第一个参数应该是一个函数的名称,并在这里它的另一个列表

关闭 - 当代码进行评估,以列表形式中的第一项是评估,并将结果作为函数调用(第一项可能是函数的名称,或者是返回函数的其他函数调用)。在这种情况下,println函数总是返回nil;试图调用nil作为函数产生您看到的NPE。

在这种情况下,编译器/运行时不应该给出更好的错误吗?

不一定 - 编译器无法提前知道评估内部函数调用的结果是否是用于外部函数调用的有效函数。以下工作蛮好的:

((partial + 1) 2) 

因为partial返回另一个函数。

+0

有意义:P thx用于快速回复。 – boogie666