我有以下类(class)。
我已经使用 javac 手动编译了这些类,并运行了Driver
类。
后来删除了entity.class
和MyCustomException.class
的,并按如下所示运行了该应用程序。
提示以下错误是因为缺少MyCustomException
,但不是关于Entity
类。因此,不清楚为什么JRE提示MyCustomException
类,而不是Entity
类。
实际上,我已经删除了throw new MyCustomException();
代码,但没有遇到有关Entity
类的错误。
Caused by: java.lang.NoClassDefFoundError: com/techdisqus/exception/MyCustomException
请注意,如果我通过测试传递命令参数,则 IF 条件将而不是被执行
为什么会引发异常,导致将加载永远不会执行的
MyCustomException
,但是除非满足条件,否则JVM不会加载任何其他常规类,如这里的Entity
类。请检查下面的Driver.java
。MyCustomException.java
public class MyCustomException extends RuntimeException {
}
实体.java
public class Entity {
}
驱动程序
public class Driver {
public static void main(String[] args) {
String s = args[0];
if("true".equals(s)){
Entity entity = new Entity(); // This is not loaded, unless s is true
throw new MyCustomException(); // this is loaded even s is NOT true.
}else{
System.out.println("success");
}
}
}
感谢帮助
最佳答案
(这是有根据的猜测;我绝不是JVM内部的专家)
我假设该错误发生在verification期间,当加载的类经过一些完整性检查时,运行时可以在以后进行一些假设。
检查之一是字节码指令的类型检查。具体来说 athrow
:
因此,此时,类加载器必须加载MyCustomException
来检查它是否扩展了Throwable