sec*_*tar 9 java jvm-hotspot java-8
我有以下课程.
我已经使用javac手动编译了类并运行了Driver该类.
后来删除了entity.class和MyCustomException.class运行应用程序,如下所示.
java驱动程序测试
以下错误被抱怨MyCustomException丢失但不是关于Entity班级.所以,不清楚为什么JRE抱怨MyCustomException课而不是Entity课.
确实我已经删除了代码,throw new MyCustomException();但我没有遇到关于Entity类的错误.
Caused by: java.lang.NoClassDefFoundError: com/techdisqus/exception/MyCustomException
Run Code Online (Sandbox Code Playgroud)
请注意,IF条件不会被执行,因为我将命令参数作为测试传递
为什么抛出异常会导致加载MyCustomException永远不会执行的异常,但除非条件满足,否则JVM不会加载任何其他常规类,如此处的Entity类所示.请检查Driver.java下面.
MyCustomException.java
public class MyCustomException extends RuntimeException {
}
Run Code Online (Sandbox Code Playgroud)
Entity.java
public class Entity {
}
Run Code Online (Sandbox Code Playgroud)
Driver.java
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");
}
}
}
Run Code Online (Sandbox Code Playgroud)
感谢帮助
(这是一个有根据的猜测;我绝不是JVM内部的专家)
我假设在验证期间发生错误,当加载的类经过一些健全性检查时,运行时可以稍后做出一些假设.
其中一项检查是字节码指令的类型检查.特别是athrow:
如果操作数堆栈的顶部与Throwable匹配,则athrow指令是类型安全的.
所以在这一点上,类加载器必须加载MyCustomException以检查它是否扩展Throwable
| 归档时间: |
|
| 查看次数: |
152 次 |
| 最近记录: |