Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/401.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java NoClassDefFoundError有时用于System.out.close()之后的标准类_Java_Classloader_Noclassdeffounderror_Logback - Fatal编程技术网

Java NoClassDefFoundError有时用于System.out.close()之后的标准类

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

我的java程序由于
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();
 }