【问题标题】:Clojure nil vs Java null?Clojure nil vs Java null?
【发布时间】:2010-10-16 01:40:25
【问题描述】:

如果我很迟钝,请原谅我,但我对 Clojure 中关于 nil 的文档有点困惑。它说:

nil 与 Java null 具有相同的值。

这是否意味着它们是相同的,或者它们在某种程度上不同? NullPointerException 是否意味着遇到了 Java null 或者如果遇到 nil 我也会得到这个?

【问题讨论】:

    标签: java clojure null


    【解决方案1】:

    来自 Clojure 源代码,lang/LispReader.java

    static private Object interpretToken(String s) throws Exception{
        if(s.equals("nil"))
            {
            return null;
            }
    

    来自lang/RT.java

    static public void print(Object x, Writer w) throws Exception{
        {
        ...
        if(x == null)
            w.write("nil");
    

    所以nil 是Clojure 对底层平台null 的表示。 nil 在 Clojure 的 Java 源代码中没有其他地方出现。 nilnull 之间的唯一区别是一个是 Clojure,另一个是 Java,但它们本质上是别名,在从 Clojure 到 Java 再到 Clojure 时,根据阅读器和打印机的需要来回无缝转换。

    是的,nil 可以导致NullPointerExceptions。尝试在 nil 上调用任何 Java 方法,你会得到一个 NPE,例如

    (.tostring nil)
    

    Clojure 源代码很容易阅读,当涉及到这样的事情时,看看吧。

    【讨论】:

      【解决方案2】:

      来自Learning Clojure

      “在大多数 Lisp 方言中,有一个与 Java null 半等价的值称为 nil。在 Clojure 中,nil 只是 Java 的 null 值,故事结束。”

      由于 Clojure 编译为 java 字节码,听起来任何对 nil 的引用都只是底层 JVM 中的空对象引用。您执行 Clojure 的 NPE 是访问 nil 的结果。

      【讨论】:

      • 不一定。 :-) 我在回溯中也有一个 java 类。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-03-16
      • 2011-10-01
      • 1970-01-01
      • 2013-11-26
      • 1970-01-01
      相关资源
      最近更新 更多