создание динамического объекта и вызов функции

Проблема заключается в том, чтобы вызвать метод отображения класса Honda. Какой метод класса будет вызываться, зависит от строковой переменной, которая будет передана во время выполнения. Здесь я использовал один родительский класс Honda, чтобы добиться полиморфизма во время выполнения. Но тогда я получаю ClassNotFoundException, даже если оно включено в предложение throws основного. Не в состоянии понять, что делать.

Вот код всех трех классов, находящихся в одном пакете.

Автомобиль.java

package com.company;

public class Vehicle {
    public void display() {
        System.out.println("Random text");
    }
}

Honda.java

package com.company;

public class Honda extends Vehicle{
    public void display()
    {
        System.out.print("honda called");
    }

}

Main.java

package com.company;

import java.lang.reflect.InvocationTargetException;

public class Main {

    public static void main(String[] args) throws ClassNotFoundException, InstantiationException, IllegalAccessException, NoSuchMethodException, InvocationTargetException {

            String className = "Honda";
            Class cls = Class.forName(className);
            Vehicle v = (Vehicle) cls.getDeclaredConstructor().newInstance();
            v.display();
    }
}

Ошибка, которую я получаю:

Exception in thread "main" java.lang.ClassNotFoundException: Honda
    at java.base/jdk.internal.loader.BuiltinClassLoader.loadClass(BuiltinClassLoader.java:581)
    at java.base/jdk.internal.loader.ClassLoaders$AppClassLoader.loadClass(ClassLoaders.java:178)
    at java.base/java.lang.ClassLoader.loadClass(ClassLoader.java:521)
    at java.base/java.lang.Class.forName0(Native Method)
    at java.base/java.lang.Class.forName(Class.java:315)
    at com.company.Main.main(Main.java:10)

Я думаю, что мне также нужно обработать ClassNotFoundException в классе Honda, но расширения и броски не могут работать одновременно. Пожалуйста, помогите мне найти проблему.


person sakshi singhal    schedule 30.05.2021    source источник


Ответы (1)


Но тогда я получаю ClassNotFoundException, даже если оно включено в предложение throws основного.

Предложение throws не останавливает возникновение исключения — оно просто указывает, что метод может генерировать это проверенное исключение.

Проблема в том, что Class.forName принимает полное имя класса, а у вас нет класса с полным именем Honda. У вас есть класс с полным именем com.company.Honda.

Если вы измените начало кода на:

String className = "com.company.Honda";

... тогда я ожидаю, что это решит проблему.

person Jon Skeet    schedule 30.05.2021
comment
Удивительно. Большое спасибо - person sakshi singhal; 30.05.2021
comment
@sakshisinghal: я бы предложил использовать это как возможность подумать о вашем диагностическом процессе - подумайте, какие вопросы вы могли бы задать себе, чтобы решить проблему. Исключения (в отличие от ошибок времени компиляции) никогда не вызваны предложением throws и т. д. Когда возникает исключение, используйте сообщение и трассировку стека, чтобы выяснить, что его вызвало. - person Jon Skeet; 30.05.2021