【问题标题】:dynamic object creation and function call [duplicate]动态对象创建和函数调用
【发布时间】:2021-08-17 19:53:09
【问题描述】:

问题是调用本田类的显示方法。将调用哪个类方法取决于将在运行时传递的字符串变量。在这里,我使用了 Honda 的一个父类,以便实现运行时多态性。但后来我得到了 ClassNotFoundException,即使它包含在 main 的 throws 子句中。不知道该怎么办。

这是同一个包中所有三个类的代码。

Vechicle.java

package com.company;

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

本田.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)

我认为我还需要处理 Honda 类中的 ClassNotFoundException,但 extends 和 throws 不能同时工作。请帮我找出问题。

【问题讨论】:

    标签: java function-call dynamicobject


    【解决方案1】:

    但是我得到了 ClassNotFoundException,即使它包含在 main 的 throws 子句中。

    throws 子句不会阻止异常发生 - 它只是指定该方法可能会抛出该检查异常。

    问题是Class.forName 接受完全限定的类名,而您没有完全限定名Honda 的类。您有一个具有完全限定名称 com.company.Honda 的类。

    如果您将代码的开头更改为:

    String className = "com.company.Honda";
    

    ...那么我希望这会解决问题。

    【讨论】:

    • 太棒了。非常感谢
    • @sakshisinghal:我建议利用这个机会来思考您的诊断过程——想想您可以问自己哪些问题来解决问题。异常(相对于编译时错误)永远不会由throws 子句等引起。发生异常时,请使用消息和堆栈跟踪来找出导致它的原因。跨度>
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-04-16
    • 1970-01-01
    • 2020-11-11
    • 1970-01-01
    相关资源
    最近更新 更多