繁体   English   中英

尝试加载资源时,在clojure.lang.Compiler中使用NPE

[英]NPE in clojure.lang.Compiler when trying to load a resource

我已经在CLJ-1172中报告了这个问题,但没有收到Clojure团队的任何反馈。 也许有人在这里可以告诉我什么是错的。 这是我的代码:

import clojure.lang.Compiler;
Compiler.load(new StringReader("(+ 5 6)"));

运行时异常:

java.lang.ExceptionInInitializerError
  at clojure.lang.Compiler.<clinit>(Compiler.java:47)
Caused by: java.lang.NullPointerException
  at clojure.lang.RT.baseLoader(RT.java:2043)
  at clojure.lang.RT.load(RT.java:417)
  at clojure.lang.RT.load(RT.java:411)
  at clojure.lang.RT.doInit(RT.java:447)
  at clojure.lang.RT.<clinit>(RT.java:329)

看起来RTCompiler类静态地相互引用。 我正在使用org.clojure:clojure:1.5.0依赖。

只要字段按正确的顺序初始化,类就可以静态引用彼此。 在这种情况下,Clojure可能希望在Compiler之前初始化RT 这是事件的顺序:

  1. 当您对Compiler进行静态调用时,Java会初始化该类中的所有静态字段。
  2. Compiler.FNONCE的静态初始化程序(第47行)在RT调用静态方法,这会导致在计算和设置FNONCE的值之前初始化整个类。
  3. 从第299行开始的RT静态初始化程序块调用静态方法,该方法最终引用静态Compiler.LOADER字段。
  4. JVM通常会在这里初始化Compiler类,但它会看到Compiler当前正在初始化并且只是获取当前值。 字段按照它们在文件中声明的顺序进行初始化,并且由于LOADERFNONCE之后返回,因此返回未初始化的null值,在RT取消引用时抛出NPE。

底线:在调用Compiler.load之前调用RT某个静态方法(或读取静态字段),您的错误应该消失。

有关类初始化细节的更多详细信息,请参见Java语言规范的第12.4节。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM