我试图测试forName()
的工作原理,但我出于某种原因得到ClassNotFoundException
。这是我的代码:
package practicePackage;
import java.lang.Class;
public class mainClass {
public static void main(String[] args) {
// TODO Auto-generated method stub
try {
Class testSar = Class.forName("practicePackage.Animal");
testSar.eat();
} catch (ClassNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
这是我的包裹的完整视图
我做错了什么?
修改
这是我的Animal.java
文件:
package practicePackage;
public class Animal {
int hunger;
char[] food;
int[] pos;
int[] boundary;
public Animal()
{
System.out.println("Animal Constructed..");
}
public void makeNoise()
{
System.out.println("Animal noise..");
}
public void eat()
{
System.out.println("Animal eat..");
}
public void sleep()
{
System.out.println("Animal sleep..");
}
public void roam()
{
System.out.println("Animal roam..");
}
}
答案 0 :(得分:4)
你调用eat方法的方式是错误的。当你这样做
Class testSar = Class.forName("practicePackage.Animal");
它返回Animal的类而不是Animal的实例。正确的做法是添加以下几行:
Animal instanceAnimal = (Animal)testStar.newInstance();
instanceAnimal.eat()
我不确定ClassNotFoundException。除了我上面提到的内容外,你的代码中的一切看起来都很好。
也许仔细检查一下你的文件是否没有从构建路径中排除,或者尝试使用另一个类,看看它是否也适用于其他类
答案 1 :(得分:3)
在2 quick fixes available
面板中,点击Surround with try/catch
。这就是如何使用像forname()
这样的方法:某些类可能并不总是可用,或者它可能存在,但它可能没有您正在寻找的方法。
如果你想真正调用eat()
方法,你可以做的是:
Animal animal = (Animal) testSar.newInstance();
animal.eat();
试试这个。它应该工作。
答案 2 :(得分:1)
如果找不到您想要的课程,那么方法forName
可能会引发那种异常,例如" practicePackage.Animal" 类。只需使用try-catch转换该句子或向该方法添加throws声明。
如果你想在Animal类中调用该方法,你必须创建该类的实例:
Class clazz = Class.forName("practicePackage.Animal");
Animal testSar = (Animal) clazz.newInstance();
testSar.eat();
答案 3 :(得分:0)
您可以使用具有默认构造函数/没有参数的成功加载的类:
Class<Animal> testSar = (Class<Animal>)Class.forName("practicePackage.Animal");
testSar.newInstance().eat();