Jython间歇性抛出java.lang.ExceptionInInitializerError

0 投票
2 回答
1074 浏览
提问于 2025-04-18 07:56

我是一名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 个回答

0

首先要做的就是看看错误信息。

在大约七行的地方,你的错误信息上写着“引起的原因:java.lang.NullPointerException”。我建议你重点关注这一点。这个null是从哪里来的呢?

另外,你的错误堆栈信息最后缺少了一些行,上面写着“... 还有7行”。这让我们很难理解错误,因为我们不知道缺少的那些行说了什么。看看有没有办法显示出缺失的行,这样可能会对你有帮助。

0

这里有个更新。我们发现这个问题是由于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。

撰写回答