J S*_*ith 17 java error-handling exception throwable
当我运行此代码时,应用程序以ClassNotFoundException退出:
//uncaught ClassNotFoundException
try
{
Class<?> clazz = defineClass(null, bytes, 0, bytes.length, null);
table.put(clazz.getName(), clazz);
}
catch (NoClassDefFoundError e)
{
}
Run Code Online (Sandbox Code Playgroud)
当我尝试编译此代码时,编译器会抱怨ClassNotFoundException无法访问,因为它不会从try-catch语句的try-clause中抛出.
//Won't compile
try
{
Class<?> clazz = defineClass(null, bytes, 0, bytes.length, null);
table.put(clazz.getName(), clazz);
}
catch (ClassNotFoundException e)
{
}
Run Code Online (Sandbox Code Playgroud)
当我运行此代码时,捕获的唯一throwable是NoClassDefFoundError.
//catches throwable of type java.lang.NoClassDefFoundError,
//with a java.lang.ClassNotFoundException as its cause
try
{
Class<?> clazz = defineClass(null, bytes, 0, bytes.length, null);
table.put(clazz.getName(), clazz);
}
catch (Throwable e)
{
System.out.println(e.getClass().getName());
System.out.println(e.getCause().getClass().getName());
}
Run Code Online (Sandbox Code Playgroud)
下面的代码将编译并捕获错误(并且只有错误),但它很笨拙:
//possible workaround
try
{
Class<?> clazz = defineClass(null, bytes, 0, bytes.length, null);
table.put(clazz.getName(), clazz);
if (1 == 0) throw new ClassNotFoundException(); // we want the code to compile
}
catch (ClassNotFoundException e)
{
System.out.println("ex");
}
catch (NoClassDefFoundError e)
{
System.out.println("err");
}
Run Code Online (Sandbox Code Playgroud)
然而,当我编写以下内容时,我可以在没有catch子句的情况下逃避错误原因:
//and yet this works just fine...
try
{
throw new Error(new IOException());
}
catch (Error e)
{
System.out.println("err");
}
Run Code Online (Sandbox Code Playgroud)
示例3将使我得出结论,throwable是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
Run Code Online (Sandbox Code Playgroud)
Per*_*ion 12
所以,你误解了你的堆栈跟踪.
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
Run Code Online (Sandbox Code Playgroud)
你的代码正在生成一个NoClassDefFoundError.的根本原因是一个ClassNotFoundException.请记住,这cause是Throwable类的属性,并且在打印堆栈跟踪时,Java将显示有关直接异常及其根本原因的信息.更难说为什么define方法在内部失败,但有一点是肯定的 - 你不能package在包名中使用关键字.
找到类的.class时会发生NoClassDefFoundError,但无法从该.class构造类.
通常会出现几种不同的情况,加上一些比较模糊的情景.
在大多数情况下,先前发生的另一个错误或异常会被类加载器捕获,并且会发出新错误信号.
目前尚不清楚上述异常追溯中究竟出现了哪种情况,但我猜测某种名称不匹配.
| 归档时间: |
|
| 查看次数: |
7290 次 |
| 最近记录: |