Почему бросать исключение попытки нагрузок класса, который расширяет Exception (хотя это не выполняется), но не регулярный класс

Секрет супер звезда:

У меня есть ниже классов.

Я вручную скомпилированы классы с использованием 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

Обратите внимание , что IF условие НЕ будет выполняться , как я передаю аргумент команды в качестве теста

Почему это бросает исключение вызывает для загрузки , MyCustomExceptionкоторый не будет выполнен ни разу , но JVM не загружать любой другой регулярный класс , если условие не выполняется, так как здесь Entityкласс здесь. Пожалуйста , проверьте Driver.javaниже.

MyCustomException.java

public class MyCustomException extends RuntimeException {

}

Entity.java

public class Entity {
}

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");
        }
    }
}

введите описание изображения здесь

Спасибо за помощь

OhleC:

(Это догадка, я отнюдь не эксперт по JVM внутренностей)

Я предполагаю , что ошибка происходит во время проверки , когда загруженный класс претерпевает некоторые проверки вменяемости , поэтому во время выполнения можно сделать некоторые предположения позже.

Одна из проверок является typecheck инструкций байт - кода. В частности athrow:

Инструкция athrow типобезопасен тогда и только тогда вершина стека операндов соответствует метательного.

Таким образом , на данный момент, загрузчик классов должен нагрузки , MyCustomExceptionчтобы проверить , распространяется ли этоThrowable

рекомендация

отhttp://43.154.161.224:23101/article/api/json?id=136806&siteId=1