У меня есть ниже классов.
Я вручную скомпилированы классы с использованием 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");
}
}
}
Спасибо за помощь
(Это догадка, я отнюдь не эксперт по JVM внутренностей)
Я предполагаю , что ошибка происходит во время проверки , когда загруженный класс претерпевает некоторые проверки вменяемости , поэтому во время выполнения можно сделать некоторые предположения позже.
Одна из проверок является typecheck инструкций байт - кода. В частности athrow
:
Инструкция athrow типобезопасен тогда и только тогда вершина стека операндов соответствует метательного.
Таким образом , на данный момент, загрузчик классов должен нагрузки , MyCustomException
чтобы проверить , распространяется ли этоThrowable