Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/339.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?_Java_Web Applications_Noclassdeffounderror - Fatal编程技术网

Java 加载/使用类后是否可以抛出NoClassDefFoundError?

Java 加载/使用类后是否可以抛出NoClassDefFoundError?,java,web-applications,noclassdeffounderror,Java,Web Applications,Noclassdeffounderror,上下文是这样的:我有一个包含所有静态方法的类和一个静态初始化块。此类是web应用程序的一部分,该应用程序打包为war并部署在WebSphere10中 在某些情况下,战争中的其他类试图调用该类的方法,结果却得到了NoClassDefFoundError。我觉得奇怪的是,我可以从日志中看到,类的方法等已经被成功地调用了多次,但突然之间,相同的(以前成功的)方法调用将立即生成NoClassDefFoundError。此时,将来对类的静态方法的任何此类调用都将生成该错误(直到重新启动WebSpehere

上下文是这样的:我有一个包含所有静态方法的类和一个静态初始化块。此类是web应用程序的一部分,该应用程序打包为war并部署在WebSphere10中

在某些情况下,战争中的其他类试图调用该类的方法,结果却得到了NoClassDefFoundError。我觉得奇怪的是,我可以从日志中看到,类的方法等已经被成功地调用了多次,但突然之间,相同的(以前成功的)方法调用将立即生成NoClassDefFoundError。此时,将来对类的静态方法的任何此类调用都将生成该错误(直到重新启动WebSpehere容器或重新部署war)

让我困惑的是,为什么在抛出NoClassDefFoundError之前,这个类似乎工作了一段时间。关于这一例外情况的报告说:

编译当前执行的类时,已存在搜索的类定义,但无法再找到该定义


所以我的问题是,为什么一个类可以使用一段时间,明确地响应对其静态方法的调用,然后抛出NoClassDefFoundError?

NoClassDefFoundError
它的not
ClassNotFoundException
。在以下情况下可能发生:

如果Java虚拟机或类加载器实例尝试 在类的定义中加载(作为普通方法调用的一部分或 作为使用新表达式创建新实例的一部分,)和 可以找到该类的定义

我的经验表明,如果静态初始值设定项块中存在异常,也可以抛出该异常


我想了解一下您在web应用程序中使用的自定义类加载器/代理。如果加载类的类加载器不再是加载器层次结构的一部分(例如,如果您使用的是自定义类加载器,并且其中存在一些错误),则可能会发生这些错误。@Matthias它只是一个普通的WebSphere 10.3.3,没有对其类加载器进行自定义或诸如此类的操作。是的,但我的问题是:即使在类的静态init块成功执行,甚至在该类上的一些成功的静态方法调用之后,如何可能进入NoClassDefFoundError情况。我们不是已经过了这一关吗?类定义不是已经成功找到并加载了吗?@ShivanDragon我现在明白了。你说得对,我一开始不理解你的问题。也许你有一些类加载器问题?我对WebSphere一点也不熟悉。看看这篇文章,也许你会发现一些有用的东西。谢谢,它非常有用,尽管最后一句话让我有点难过:“请注意,Java EE容器(如Oracle Weblogic)具有覆盖此默认类加载器委托行为的机制。我将在以后的文章中继续讨论此问题。”:(((@ShivanDragon也许你应该看一下接下来的部分(,)在本文的第四部分,我发现你可以在详细模式下运行JVM,这会显示类加载器信息,也许这就是解决这个问题的方法