Jython间歇性抛出java.lang.ExceptionInInitializerError
我是一名Java开发者,对Jython或Python不太熟悉。如果这个问题很基础,请多包涵。
我正在使用jython 2.5, python 2.5 和 jre 1.7
。
有时候,Jython解释器无法启动,并且出现了这样的错误:
在“主”线程中出现异常 java.lang.ExceptionInInitializerError - 在 java.lang.J9VMInternals.initialize(J9VMInternals.java:258) - 在 org.python.core.PySystemState.initStaticFields(PySystemState.java:912) - 在 org.python.core.PySystemState.doInitialize(PySystemState.java:882) - 在 org.python.core.PySystemState.initialize(PySystemState.java:800) - 在 org.python.core.PySystemState.initialize(PySystemState.java:750) - 在 org.python.core.PySystemState.initialize(PySystemState.java:743) - 在 org.python.util.jython.run(jython.java:150) - 在 org.python.util.jython.main(jython.java:129) - 原因是:java.lang.NullPointerException - 在 org.python.core.PyObject._cmpeq_unsafe(PyObject.java:1362) - 在 org.python.core.PyObject._eq(PyObject.java:1456) - 在 org.python.core.PyObject.equals(PyObject.java:244) - 在 java.util.HashMap.put(HashMap.java:475) - 在 java.util.HashSet.add(HashSet.java:217) - 在 org.python.core.PyType.fromClass(PyType.java:1317) - 在 org.python.core.PyType.fromClass(PyType.java:1275) - 在 org.python.core.PyEllipsis.(PyEllipsis.java:14) - 在 java.lang.J9VMInternals.initializeImpl(本地方法) - 在 java.lang.J9VMInternals.initialize(J9VMInternals.java:236) - ... 还有7个更多的
我在网上搜索过,但没有找到任何有用的信息。
如果你们中有人解决了这个问题,请分享一下。
谢谢,
Ashoka
2 个回答
首先要做的就是看看错误信息。
在大约七行的地方,你的错误信息上写着“引起的原因:java.lang.NullPointerException
”。我建议你重点关注这一点。这个null
是从哪里来的呢?
另外,你的错误堆栈信息最后缺少了一些行,上面写着“... 还有7行”。这让我们很难理解错误,因为我们不知道缺少的那些行说了什么。看看有没有办法显示出缺失的行,这样可能会对你有帮助。
这里有个更新。我们发现这个问题是由于jython初始化时的一个bug造成的。我们内部的专家发现了这个问题。
在PySystemState的initStaticFields和initBuildins方法中,PyTypes会在Py.False和Py.True初始化之前就被初始化。有时候,这会导致出现一个叫做ExceptionInInitializerError的错误,因为在PyObject._cmpeq_unsafe中发生了空指针异常。
问题的根本原因是PyType.fromClass会把所有类型存储在一个叫做exposedTypes的HashSet中。如果在初始化过程中,有两个PyTypes的hashCode相同,HashSet就会使用equals方法来比较。这时候,PyObject.equals方法中调用的一些方法会返回Py.True或Py.False(见PyObject._is),而这两个值在最开始的PyTypes中并没有被初始化……
我们只在AIX系统上看到过这个错误,并且是在一个每天生成超过10000次Jython运行的应用程序中。
关于这个bug的更多信息可以查看 http://bugs.jython.org/issue2163
解决方案:一个修复方法是确保PyTrue和PyFalse在PyType初始化开始时就被初始化。然后重新构建jython.jar。