Почему генерирование исключения пытается загрузить класс (хотя он не выполняется), а не обычный класс - PullRequest
0 голосов
/ 21 февраля 2019

У меня есть следующие классы.

Я вручную скомпилировал классы, используя javac и запустил класс Driver.

Позже удалено entity.class и MyCustomException.class и запустили приложение, как показано ниже.

java test test

Приведенная ниже ошибка жалуется на то, что MyCustomException отсутствует, но нео классе Entity.Итак, не ясно, почему JRE жалуется на класс MyCustomException, а не на класс Entity.

Действительно, я удалил код throw new MyCustomException();, но я не обнаружил ошибку о Entity классе.

Caused by: java.lang.NoClassDefFoundError: com/techdisqus/exception/MyCustomException

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

Почему выдается исключение, вызывающее загрузку 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");
        }
    }
}

enter image description here

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

Ответы [ 2 ]

0 голосов
/ 21 февраля 2019

(это обоснованное предположение; я ни в коем случае не эксперт по внутренним компонентам JVM)

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

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

Команда athrow является типобезопасной, если верхняя часть стека операндов соответствует Throwable.

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

0 голосов
/ 21 февраля 2019

Я запустил твой код.Работает нормально.Существует разница между загрузкой «обычных» классов и подклассов класса Exception.Проблема в том, что вы скомпилировали только один класс (из изображения, которым вы поделились).И нет никаких файлов .class для двух других классов (Entity и MyCustomException).

Скомпилируйте оба класса следующим образом:

cd src
javac ./package_folder/* //where package_folder is the package folder containing your classes

после этого запустите класс, используя:

java package_folder.Driver test

Посмотрите на мои файлы результатов на картинке: enter image description here

Надеюсь, это поможет!

...