Java NoClassDefFoundError有时用于System.out.close()之后的标准类
我的java程序由于Java NoClassDefFoundError有时用于System.out.close()之后的标准类,java,classloader,noclassdeffounderror,logback,Java,Classloader,Noclassdeffounderror,Logback,我的java程序由于NoClassDefFoundError而神秘地崩溃。神秘之处在于,异常消息表明有问题的类是java/util/concurrent/CopyOnWriteArrayList$coweiterator,它是JRE的一部分。该异常是在其他JRE类加载后引发的,没有出现问题 异常是从logback(版本1.1.3)引发的,似乎是在它遍历要写入的附加程序列表时(我猜它使用CopyOnWriteArrayList来保存附加程序列表): Java报告其版本为 java version
NoClassDefFoundError
而神秘地崩溃。神秘之处在于,异常消息表明有问题的类是java/util/concurrent/CopyOnWriteArrayList$coweiterator
,它是JRE的一部分。该异常是在其他JRE类加载后引发的,没有出现问题
异常是从logback
(版本1.1.3)引发的,似乎是在它遍历要写入的附加程序列表时(我猜它使用CopyOnWriteArrayList
来保存附加程序列表):
Java报告其版本为
java version "1.7.0_75"
OpenJDK Runtime Environment (rhel-2.5.4.2.el7_0-x86_64 u75-b13)
OpenJDK 64-Bit Server VM (build 24.75-b04, mixed mode)
我的程序不执行任何显式类加载,也没有自定义类加载程序:它使用默认类加载程序。但是,他指出,如果我这样做了,这不重要,因为Java平台类应该是
当我的程序失败时,我的代码没有创建任何线程。我的代码不包含任何本机代码,因此没有可能混淆事情的“外部”线程。但是,我相信logback
创建了一些线程,当然也有普通的Java守护进程线程
还有另一个神秘的方面。在创建logback
记录器(使用org.slf4j.LoggerFactory.getLogger(MyProgram.class)
)和调用导致异常的logger.info(String)
方法之间,我的应用程序所做的基本上就是关闭标准输入、标准输出和标准错误输出流,使用对此方法的调用:
private static void closeSystemStreams() {
try {
System.in.close();
} catch (IOException e) {
// Do nothing; should never happen, and there is nothing we can do if
// it does
}
System.out.close();
System.err.close();
}
如果省略结束代码,程序运行正常。现在,我可以理解在某些情况下关闭这些流可能会失败(和),但为什么它会干扰引导类装入器呢
如何确保
logback
或JVM不会出现此类类加载问题?如果标准流关闭,一些Java库代码似乎会混淆。也许某个地方有一个硬编码的文件描述符值检查。这可能是一个bug,也可能不是,这取决于您对行为的理解有多慷慨。不关闭标准流似乎是最安全的。请发布真正的堆栈跟踪。his none中没有系统类。系统类具有系统包名称。另请参见
java version "1.7.0_75"
OpenJDK Runtime Environment (rhel-2.5.4.2.el7_0-x86_64 u75-b13)
OpenJDK 64-Bit Server VM (build 24.75-b04, mixed mode)
private static void closeSystemStreams() {
try {
System.in.close();
} catch (IOException e) {
// Do nothing; should never happen, and there is nothing we can do if
// it does
}
System.out.close();
System.err.close();
}