我有以下类(class)。

我已经使用 javac 手动编译了这些类,并运行了Driver类。

后来删除了entity.classMyCustomException.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");
        }
    }
}

java - 为什么抛出异常会尝试加载扩展了Exception的类(尽管未执行),而不是常规类-LMLPHP

感谢帮助

最佳答案

(这是有根据的猜测;我绝不是JVM内部的专家)

我假设该错误发生在verification期间,当加载的类经过一些完整性检查时,运行时可以在以后进行一些假设。

检查之一是字节码指令的类型检查。具体来说 athrow :



因此,此时,类加载器必须加载MyCustomException来检查它是否扩展了Throwable

09-28 09:29