Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/402.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
如果NoClassDefFoundError是由ClassNotFoundException引起的,为什么Java希望您捕获这两个丢弃的文件?_Java_Exception_Error Handling_Throwable - Fatal编程技术网

如果NoClassDefFoundError是由ClassNotFoundException引起的,为什么Java希望您捕获这两个丢弃的文件?

如果NoClassDefFoundError是由ClassNotFoundException引起的,为什么Java希望您捕获这两个丢弃的文件?,java,exception,error-handling,throwable,Java,Exception,Error Handling,Throwable,当我运行此代码时,应用程序将退出,并出现ClassNotFoundException: //uncaught ClassNotFoundException try { Class<?> clazz = defineClass(null, bytes, 0, bytes.length, null); table.put(clazz.getName(), clazz); } catch (NoClassDefFoundError e) { } 例3会让我得出结论,抛弃是

当我运行此代码时,应用程序将退出,并出现ClassNotFoundException:

//uncaught ClassNotFoundException
try
{
    Class<?> clazz = defineClass(null, bytes, 0, bytes.length, null);
    table.put(clazz.getName(), clazz);
}
catch (NoClassDefFoundError e)
{
}
例3会让我得出结论,抛弃是一个NoClassDefFoundError。 示例1会让我得出结论,throwable是ClassNotFoundException。 然而,示例2显示java甚至不允许我编写代码来正确捕获ClassNotFoundException

就在我即将得出结论,这里的问题是由异常引起的错误时,我运行了上一个示例中显示的代码,这表明这不是规则

有人能解释一下这是怎么回事吗

PS:这是堆栈跟踪:

 java.lang.NoClassDefFoundError: com/my/pckage/MyClass
at java.lang.ClassLoader.defineClass1(Native Method)
at java.lang.ClassLoader.defineClass(ClassLoader.java:791)
at Main$MyClassLoader.getClasses(Main.java:78)
at Main.main(Main.java:109)
 Caused by: java.lang.ClassNotFoundException: com.my.pckage.MyClass
at java.lang.ClassLoader.findClass(ClassLoader.java:522)
at java.lang.ClassLoader.loadClass(ClassLoader.java:423)
at java.lang.ClassLoader.loadClass(ClassLoader.java:356)
... 4 more

NoClassDefFoundError
实际上是
Error
的一个子类,不应捕获这些子类。有关详细信息,请参阅。以下是重要的说明:

错误是Throwable的一个子类,表示存在严重问题 一个合理的应用程序不应该试图抓住。大多数这样的 错误是异常情况

方法不需要在其throws子句中声明任何 在执行过程中可能引发的错误的子类 方法,但未捕获,因为这些错误是 不应该发生


出于这个原因,我认为您应该仔细查看您的代码,看看您做错了什么。

正如已经指出的,Java不允许您处理错误

不管怎么说,我不太确定您试图解决这些异常(和错误)的原因是什么,但程序员(大多数时候)并不需要担心这些情况。对我来说,这是代码/项目中其他地方存在问题的征兆。如果系统抛出一个
ClassNotFoundException
,并允许您捕获它,您将如何处理它?或者您更愿意解决实际问题,即应用程序所需的某个类不在类路径中


此外,您可能需要检查以更好地解决您的问题。

NoClassDefFoundError在找到类的.class时发生,但无法从该.class构造该类

通常会出现几种不同的场景,还有一些更为模糊的场景

  • .class文件包含与类文件名/包不匹配的名称(和包)
  • 找不到验证和初始化该类所需的类
  • 类初始化期间发生错误
在大多数情况下,还有另一个错误或异常发生在前面,被类加载器捕获,并发出新错误的信号


目前还不清楚在上述异常回溯中到底发生了哪种情况,但我猜是某种名称不匹配。

因此,您误解了堆栈跟踪

java.lang.NoClassDefFoundError: com/my/package/MyClass
    at java.lang.ClassLoader.defineClass1(Native Method)
    at java.lang.ClassLoader.defineClass(ClassLoader.java:791)
    at Main$MyClassLoader.getClasses(Main.java:78)
    at Main.main(Main.java:109)
Caused by: java.lang.ClassNotFoundException: com.my.package.MyClass
您的代码正在生成一个
NoClassDefFoundError
根本原因是
ClassNotFoundException
。请记住,
cause
是Throwable类的一个属性,当打印stacktraces时,Java将显示有关直接异常及其根本原因的信息。很难说为什么
define
方法在内部失败,但有一点是肯定的,那就是不能在包名称中使用关键字
package

//and yet this works just fine...
try
{
    throw new Error(new IOException());
}
catch (Error e)
{
    System.out.println("err");
}
替换为:

//and yet this still works fine...
try
{
    throw new NoClassDefFoundError(new ClassNotFoundException());
}
catch (Error e)
{
    System.out.println("err");
}

试试e.printStackTrace(),您会看到类似的输出。

有些东西不符合要求。假设您正在编写自定义类加载器,请包括您为其定义的任何重写方法。
defineClass
不会引发ClassNotFoundException。如果你得到了这个异常,它来自其他地方。@j-smith如果你能给出一个sscce来说明问题,那就更好了。有相当多的可能性出现不匹配的异常。例如,导致应用程序退出的“最终”异常可能是由某个外部级别引发的,它捕获您的NoClassDefFoundError并使用ClassNotFoundException重新刷新。如果您可以检查异常的“原因”以及异常中的调用堆栈,则更好。它可以让您了解异常的实际来源。@AdrianShum如果捕获到一个
异常
,然后获取异常的堆栈跟踪,这是一个完全可行的解决方案。@syb0rg用于调试,否则您实际上无法解决任何问题。是的,您肯定可以“处理”错误,从捕捉它们的纯机械角度来看。不过,一般来说,您可能无法从它们中完全恢复。@JSmith-一般来说,合理的应用程序不会处理错误以及未检查的异常。相反,它们将强制执行这样的条件/机制,因为它们将防止抛出这样的错误或异常,因此,不存在处理它们的问题。我想说的是,在它们被抛出之前,应该(由应用程序开发人员)阻止它们。是的,我不应该说“Java将不允许”,就好像它会抱怨它一样,因为try-catch最终是围绕可抛出的而不是异常而设计的。你可以做的更多,但你不应该做。代码生成的NoClassDefFoundError带有ClassNotFoundException的潜在原因这一事实并不能回答这个问题。我还确认,即使使用传统的包名,这种异常行为仍然存在。@JSmith-请发布代码,显示调用
defineClass
方法时抛出ClassNotFoundException,但不允许显式的catch块。@JSmith Perception的回答很好地回答了这个问题:“根本原因”
ClassNotFoundException
NoClassDefFoundError
包装,因此不会被
catch(ClassNotFoundException e)
捕获。
 java.lang.NoClassDefFoundError: com/my/pckage/MyClass
at java.lang.ClassLoader.defineClass1(Native Method)
at java.lang.ClassLoader.defineClass(ClassLoader.java:791)
at Main$MyClassLoader.getClasses(Main.java:78)
at Main.main(Main.java:109)
 Caused by: java.lang.ClassNotFoundException: com.my.pckage.MyClass
at java.lang.ClassLoader.findClass(ClassLoader.java:522)
at java.lang.ClassLoader.loadClass(ClassLoader.java:423)
at java.lang.ClassLoader.loadClass(ClassLoader.java:356)
... 4 more
java.lang.NoClassDefFoundError: com/my/package/MyClass
    at java.lang.ClassLoader.defineClass1(Native Method)
    at java.lang.ClassLoader.defineClass(ClassLoader.java:791)
    at Main$MyClassLoader.getClasses(Main.java:78)
    at Main.main(Main.java:109)
Caused by: java.lang.ClassNotFoundException: com.my.package.MyClass
//and yet this works just fine...
try
{
    throw new Error(new IOException());
}
catch (Error e)
{
    System.out.println("err");
}
//and yet this still works fine...
try
{
    throw new NoClassDefFoundError(new ClassNotFoundException());
}
catch (Error e)
{
    System.out.println("err");
}